From fb8ea1d2e33a34ea611dacaf35d4dd491abbadaa Mon Sep 17 00:00:00 2001 From: Shiv Thakker Date: Thu, 3 Sep 2026 13:01:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(seo):=20phase=201=20&=202=20=E2=80=94?= =?UTF-8?q?=20indexing,=20titles,=20descriptions,=20social=20cards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1 — stop the bleeding SEO-01 Strip ?ref=blog.fleetbase.io duplicates. Canonicals already pointed at the clean path on every URL checked, so the fix is hardening rather than repair: middleware now 308s the parameter away so those URLs cannot be crawled as pages at all. The five stale paths the plan lists already redirect in next.config.ts. SEO-02 Keep the console out of Google. The console app itself lives in another repo; what belongs here is the link equity. Every CTA pointing at console.fleetbase.io now carries rel="nofollow", via a shared relForHref helper so the two navbar render sites, the solutions layout and 27 direct links stay consistent. SEO-03 Fix the blog robots.txt 500. Root cause was broader than the plan describes: fetchGhost threw on any non-OK response, and Ghost answers an unknown slug with a 404 — so *every* bad /blog/* URL returned a 500, not just robots.txt. Slug lookups now treat 404 as "no such post" and fall through to notFound(). Phase 2 — one template pass SEO-04 52 pages hardcoded "| Fleetbase" while the root layout appends it again via title.template. Stripped from the top-level title only — openGraph.title and twitter.title are not templated, so they keep the brand. 16 over-length titles trimmed under 60 characters. Long blog headlines now return an absolute title, dropping the suffix rather than cutting the headline. SEO-05 57 descriptions rewritten to 120–155 characters, hand-written per page rather than truncated, since these are sales pages. Blog excerpts (~500 chars from Ghost) truncate at a word boundary. The three auth screens get noindex instead of padded copy — they have no search value. SEO-06 Won't-fix, documented at the schema. Every property the plan asks for is already present; the only gap is aggregateRating, which Google requires to be backed by real reviews. Inventing one would be fabricating data. SEO-07 The plan says only blog posts have Open Graph tags; that is not true of the live site — 67 pages already had them. The genuine gaps were the /compare hub and all 11 docs routes, which now share a buildDocsMetadata helper adding canonical, OG and Twitter cards built from each page's frontmatter. Co-Authored-By: Claude Opus 5 --- src/app/(auth)/otp/page.tsx | 6 +- src/app/(auth)/signin/page.tsx | 6 +- src/app/(auth)/signup/page.tsx | 6 +- src/app/blog/[slug]/page.tsx | 17 +++-- src/app/blog/page.tsx | 2 +- src/app/changelog/page.tsx | 4 +- src/app/community/page.tsx | 4 +- src/app/company/about/page.tsx | 6 +- src/app/company/investors/page.tsx | 4 +- src/app/company/open-source/page.tsx | 4 +- src/app/company/page.tsx | 2 +- src/app/compare/page.tsx | 27 ++++++-- src/app/compare/vs-onfleet/page.tsx | 6 +- src/app/compare/vs-route4me/page.tsx | 6 +- src/app/compare/vs-tookan/page.tsx | 6 +- src/app/contact/sales/page.tsx | 4 +- src/app/developers/api/api-page-content.tsx | 2 +- src/app/developers/api/page.tsx | 4 +- src/app/developers/extensions/page.tsx | 4 +- src/app/developers/page.tsx | 4 +- src/app/developers/sdks/page.tsx | 4 +- .../webhooks/webhooks-page-content.tsx | 4 +- src/app/docs/(platform)/[[...slug]]/page.tsx | 10 +-- src/app/docs/ai/[[...slug]]/page.tsx | 10 +-- src/app/docs/api/[[...slug]]/page.tsx | 10 +-- src/app/docs/cli/[[...slug]]/page.tsx | 10 +-- .../docs/contributing/[[...slug]]/page.tsx | 10 +-- .../[[...slug]]/page.tsx | 10 +-- src/app/docs/fleet-ops/[[...slug]]/page.tsx | 10 +-- src/app/docs/ledger/[[...slug]]/page.tsx | 10 +-- src/app/docs/pallet/[[...slug]]/page.tsx | 10 +-- src/app/docs/storefront/[[...slug]]/page.tsx | 10 +-- src/app/docs/ui/[[...slug]]/page.tsx | 10 +-- src/app/licensing/commercial/page.tsx | 4 +- src/app/licensing/page.tsx | 4 +- src/app/oli-max/page.tsx | 4 +- src/app/page.tsx | 4 +- src/app/partners/page.tsx | 4 +- src/app/platform/ai/page.tsx | 8 +-- .../console-page-content.tsx | 4 +- src/app/platform/developer-console/page.tsx | 2 +- .../extensions/extensions-page-content.tsx | 6 +- src/app/platform/extensions/page.tsx | 4 +- src/app/platform/fleetops/page.tsx | 2 +- src/app/platform/ledger/page.tsx | 2 +- src/app/platform/mobile/page.tsx | 2 +- src/app/platform/navigator/page.tsx | 4 +- src/app/platform/page.tsx | 4 +- src/app/platform/pallet/page.tsx | 4 +- src/app/platform/platform-page-content.tsx | 4 +- src/app/platform/security/page.tsx | 4 +- src/app/platform/storefront/page.tsx | 4 +- src/app/pricing/page.tsx | 2 +- src/app/privacy/page.tsx | 4 +- src/app/services/installation/page.tsx | 4 +- src/app/services/installation/terms/page.tsx | 2 +- .../services/navigator-publishing/page.tsx | 4 +- src/app/services/page.tsx | 4 +- .../services/storefront-publishing/page.tsx | 4 +- .../solutions/container-operations/page.tsx | 4 +- src/app/solutions/courier-services/page.tsx | 4 +- src/app/solutions/ecommerce/page.tsx | 4 +- src/app/solutions/food-delivery/page.tsx | 4 +- src/app/solutions/government/page.tsx | 4 +- src/app/solutions/healthcare/page.tsx | 4 +- src/app/solutions/page.tsx | 6 +- .../solutions/roles/customer-success/page.tsx | 4 +- src/app/solutions/roles/developers/page.tsx | 4 +- src/app/solutions/roles/executives/page.tsx | 4 +- .../solutions/roles/fleet-managers/page.tsx | 4 +- .../roles/operations-managers/page.tsx | 4 +- .../roles/warehouse-managers/page.tsx | 4 +- src/app/solutions/trucking/page.tsx | 4 +- .../solutions/use-cases/analytics/page.tsx | 4 +- .../use-cases/fleet-management/page.tsx | 4 +- .../solutions/use-cases/integrations/page.tsx | 4 +- .../use-cases/last-mile-delivery/page.tsx | 4 +- .../use-cases/order-management/page.tsx | 4 +- .../use-cases/route-optimization/page.tsx | 4 +- src/app/solutions/waste-management/page.tsx | 4 +- src/app/terms/page.tsx | 2 +- src/app/true-vegan/page.tsx | 4 +- src/components/layout/footer.tsx | 2 +- src/components/layout/navbar.tsx | 13 +++- src/components/placeholder-page.tsx | 2 +- src/components/sections/final-cta.tsx | 2 +- src/components/sections/hero.tsx | 2 +- src/components/sections/problem-solution.tsx | 2 +- src/components/seo/json-ld.tsx | 10 +++ .../solutions/solution-page-layout.tsx | 7 ++- src/lib/docs-metadata.ts | 63 +++++++++++++++++++ src/lib/external-link.ts | 32 ++++++++++ src/lib/ghost.ts | 36 +++++++++-- src/lib/seo-text.ts | 44 +++++++++++++ src/middleware.ts | 40 ++++++++++++ 95 files changed, 488 insertions(+), 199 deletions(-) create mode 100644 src/lib/docs-metadata.ts create mode 100644 src/lib/external-link.ts create mode 100644 src/lib/seo-text.ts create mode 100644 src/middleware.ts diff --git a/src/app/(auth)/otp/page.tsx b/src/app/(auth)/otp/page.tsx index 5c347b73..02b133ff 100644 --- a/src/app/(auth)/otp/page.tsx +++ b/src/app/(auth)/otp/page.tsx @@ -3,7 +3,11 @@ import type { Metadata } from 'next'; import OTPPageContent from './otp-page-content'; export const metadata: Metadata = { - title: 'Verify Your Account | Fleetbase', + // Account screens have no search value and would only dilute the site's + // quality signals. robots.txt already disallows these paths; the meta tag + // covers the case where Google reaches one from an external link. + robots: { index: false, follow: false }, + title: 'Verify Your Account', description: 'Enter your one-time passcode to verify your Fleetbase account.', keywords: 'fleetbase login, otp verification, account access', openGraph: { diff --git a/src/app/(auth)/signin/page.tsx b/src/app/(auth)/signin/page.tsx index 6c788a3b..446e8e8f 100644 --- a/src/app/(auth)/signin/page.tsx +++ b/src/app/(auth)/signin/page.tsx @@ -3,7 +3,11 @@ import type { Metadata } from 'next'; import SignInPageContent from './signin-page-content'; export const metadata: Metadata = { - title: 'Sign In | Fleetbase', + // Account screens have no search value and would only dilute the site's + // quality signals. robots.txt already disallows these paths; the meta tag + // covers the case where Google reaches one from an external link. + robots: { index: false, follow: false }, + title: 'Sign In', description: 'Sign in to your Fleetbase account to manage your logistics operations.', keywords: 'fleetbase sign in, logistics platform login, fleet management login', openGraph: { diff --git a/src/app/(auth)/signup/page.tsx b/src/app/(auth)/signup/page.tsx index aa5bc60b..2b4b6b7a 100644 --- a/src/app/(auth)/signup/page.tsx +++ b/src/app/(auth)/signup/page.tsx @@ -3,7 +3,11 @@ import type { Metadata } from 'next'; import SignUpPageContent from './signup-page-content'; export const metadata: Metadata = { - title: 'Create Your Account | Fleetbase', + // Account screens have no search value and would only dilute the site's + // quality signals. robots.txt already disallows these paths; the meta tag + // covers the case where Google reaches one from an external link. + robots: { index: false, follow: false }, + title: 'Create Your Account', description: 'Create a free Fleetbase account and start building your logistics operations today.', keywords: 'fleetbase signup, create account, free logistics platform', openGraph: { diff --git a/src/app/blog/[slug]/page.tsx b/src/app/blog/[slug]/page.tsx index 14dcc6f1..e772a7b9 100644 --- a/src/app/blog/[slug]/page.tsx +++ b/src/app/blog/[slug]/page.tsx @@ -8,6 +8,7 @@ import { BlogPostTracker } from '@/components/analytics/BlogPostTracker'; import { BlogPostingSchema } from '@/components/seo/json-ld'; import { Button } from '@/components/ui/button'; import { formatBlogHtml } from '@/lib/blog-html'; +import { titleWithinLimit, truncateAtWord } from '@/lib/seo-text'; import { type BlogPost, getAllBlogPosts, @@ -58,7 +59,7 @@ export async function generateMetadata(props: { if (!post) { return { - title: 'Blog | Fleetbase', + title: 'Blog', }; } @@ -77,9 +78,15 @@ export async function generateMetadata(props: { }, ]; + // Ghost gives us the full excerpt (~500 characters on most posts). Google + // truncates well before that, and Ahrefs flags every one of them, so the meta + // description is cut to a word boundary while the page itself still renders + // the full excerpt. + const metaDescription = truncateAtWord(post.excerpt); + return { - title: post.title, - description: post.excerpt, + title: titleWithinLimit(post.title), + description: metaDescription, alternates: { canonical: canonicalUrl, }, @@ -87,7 +94,7 @@ export async function generateMetadata(props: { type: 'article', url: canonicalUrl, title: post.title, - description: post.excerpt, + description: metaDescription, publishedTime: post.publishedAt, images: image, authors: post.authors.map((author) => author.name), @@ -96,7 +103,7 @@ export async function generateMetadata(props: { twitter: { card: 'summary_large_image', title: post.title, - description: post.excerpt, + description: metaDescription, images: image.map((item) => item.url), }, }; diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx index 574816bb..deb80826 100644 --- a/src/app/blog/page.tsx +++ b/src/app/blog/page.tsx @@ -8,7 +8,7 @@ import { getAllBlogPosts } from '@/lib/ghost'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/blog' }, - title: 'Blog | Fleetbase', + title: 'Blog', description: 'Product updates, engineering deep-dives, logistics industry insights, and open-source news from the Fleetbase team. Stay up to date with the latest from the platform.', keywords: [ diff --git a/src/app/changelog/page.tsx b/src/app/changelog/page.tsx index 1cccc279..2be71552 100644 --- a/src/app/changelog/page.tsx +++ b/src/app/changelog/page.tsx @@ -3,8 +3,8 @@ import ChangelogPageContent from './changelog-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/changelog' }, - title: 'Changelog | Fleetbase', - description: 'See the latest updates, new features, and improvements to the Fleetbase platform.', + title: 'Changelog', + description: 'Release notes for the Fleetbase platform — the latest updates, new features, fixes and improvements, version by version.', keywords: 'fleetbase changelog, platform updates, new features, release notes', openGraph: { title: 'Changelog | Fleetbase', diff --git a/src/app/community/page.tsx b/src/app/community/page.tsx index f3ee8899..f567082e 100644 --- a/src/app/community/page.tsx +++ b/src/app/community/page.tsx @@ -5,9 +5,9 @@ import { Button } from '@/components/ui/button'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/community' }, - title: 'Community | Fleetbase', + title: 'Community', description: - 'Join the Fleetbase community — thousands of logistics operators, developers, and contributors on Discord, GitHub, and our developer forums. Get help, share ideas, and shape the platform.', + 'Join thousands of logistics operators, developers and contributors on Discord, GitHub and our forums. Get help, share ideas, shape the platform.', keywords: ['fleetbase community', 'logistics software community', 'fleetbase discord', 'open source logistics community'], openGraph: { title: 'Community | Fleetbase', diff --git a/src/app/company/about/page.tsx b/src/app/company/about/page.tsx index a72f0789..c4da1e67 100644 --- a/src/app/company/about/page.tsx +++ b/src/app/company/about/page.tsx @@ -5,9 +5,9 @@ import { ArrowRight, Globe, Heart, Zap, Shield, Code2, MapPin, Linkedin, Puzzle import { Button } from '@/components/ui/button'; export const metadata: Metadata = { - title: 'About Fleetbase | Open-Source Logistics Platform — Singapore', + title: 'About — Open-Source Logistics from Singapore', description: - 'Fleetbase is an open-source logistics and fleet management platform founded in 2018 in Singapore by Shiv Thakker and Ronald Richardson. Learn our story, mission, and the team behind the platform.', + 'Fleetbase is an open-source logistics platform founded in Singapore in 2018 by Shiv Thakker and Ronald Richardson. Our story, mission and team.', keywords: ['about fleetbase', 'fleetbase team', 'open source logistics company', 'fleetbase singapore', 'logistics startup singapore', 'shiv thakker', 'ronald richardson'], alternates: { canonical: 'https://fleetbase.io/company/about' }, openGraph: { @@ -414,7 +414,7 @@ export default function AboutPage() {

diff --git a/src/app/company/investors/page.tsx b/src/app/company/investors/page.tsx index 19112770..ea63fa73 100644 --- a/src/app/company/investors/page.tsx +++ b/src/app/company/investors/page.tsx @@ -20,9 +20,9 @@ import { Button } from '@/components/ui/button'; import { getGitHubStars } from '@/lib/github-stars'; export const metadata: Metadata = { - title: 'Investors | Fleetbase', + title: 'Investors', description: - 'Fleetbase is a bootstrapped, profitable open-source logistics platform powering 8,000+ active instances and 10M+ orders globally. Learn about the opportunity, our model, and what we look for in long-term partners.', + 'A bootstrapped, profitable open-source logistics platform powering 8,000+ active instances and 10M+ orders. The opportunity and our model.', keywords: [ 'fleetbase investors', 'open source logistics investment', diff --git a/src/app/company/open-source/page.tsx b/src/app/company/open-source/page.tsx index f09535bf..de25d346 100644 --- a/src/app/company/open-source/page.tsx +++ b/src/app/company/open-source/page.tsx @@ -5,9 +5,9 @@ import { Button } from '@/components/ui/button'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/company/open-source' }, - title: 'Open Source Mission | Fleetbase', + title: 'Open Source Mission', description: - 'Fleetbase is fully open-source under AGPL-3.0. Learn why we chose open source, what it means for your deployment, how to self-host, and how to contribute to the project.', + 'Fleetbase is fully open-source under AGPL-3.0. Why we chose it, what it means for your deployment, how to self-host and how to contribute.', keywords: ['fleetbase open source', 'open source logistics platform', 'AGPL logistics software', 'self-hosted fleet management'], openGraph: { title: 'Open Source Mission | Fleetbase', diff --git a/src/app/company/page.tsx b/src/app/company/page.tsx index bc77d5be..b6c6757d 100644 --- a/src/app/company/page.tsx +++ b/src/app/company/page.tsx @@ -7,7 +7,7 @@ export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/company' }, title: 'Company', description: - 'Fleetbase is the open-source logistics platform built to democratize logistics technology. Learn about our mission, team, open-source commitment, and how to get involved.', + 'The open-source logistics platform built to democratise logistics technology. Our mission, team, open-source commitment and how to get involved.', openGraph: { title: 'Company | Fleetbase', description: 'Open-source logistics infrastructure built to democratize logistics technology.', diff --git a/src/app/compare/page.tsx b/src/app/compare/page.tsx index 18aa587c..9e0fa028 100644 --- a/src/app/compare/page.tsx +++ b/src/app/compare/page.tsx @@ -3,10 +3,15 @@ import Link from 'next/link'; import { ArrowRight } from 'lucide-react'; import { Button } from '@/components/ui/button'; +const COMPARE_DESCRIPTION = + 'See how Fleetbase compares to Onfleet, Tookan and Route4Me. Open-source fleet management with no per-task or per-agent pricing.'; + +const COMPARE_OG_IMAGE = + '/og?title=Fleetbase%20vs%20Onfleet%2C%20Tookan%20%26%20Route4Me&eyebrow=Compare&subtitle=Open-source%20fleet%20management%20with%20no%20per-task%20pricing.'; + export const metadata: Metadata = { - title: 'Fleetbase Comparisons | Open-Source Alternative to Onfleet, Tookan, Route4Me', - description: - 'See how Fleetbase compares to Onfleet, Tookan, Route4Me, and Bringg. Open-source fleet management and TMS software with no per-task or per-agent pricing.', + title: 'Compare Fleetbase: Onfleet, Tookan & Route4Me', + description: COMPARE_DESCRIPTION, keywords: [ 'Onfleet alternative', 'Tookan alternative', @@ -16,6 +21,20 @@ export const metadata: Metadata = { 'delivery management software comparison', ], alternates: { canonical: 'https://fleetbase.io/compare' }, + openGraph: { + type: 'website', + url: 'https://fleetbase.io/compare', + title: 'Compare Fleetbase: Onfleet, Tookan & Route4Me | Fleetbase', + description: COMPARE_DESCRIPTION, + siteName: 'Fleetbase', + images: [{ url: COMPARE_OG_IMAGE, width: 1200, height: 630, alt: 'Fleetbase compared with Onfleet, Tookan and Route4Me' }], + }, + twitter: { + card: 'summary_large_image', + title: 'Compare Fleetbase: Onfleet, Tookan & Route4Me | Fleetbase', + description: COMPARE_DESCRIPTION, + images: [COMPARE_OG_IMAGE], + }, }; const COMPARISONS = [ @@ -106,7 +125,7 @@ export default function ComparePage() {

diff --git a/src/app/compare/vs-onfleet/page.tsx b/src/app/compare/vs-onfleet/page.tsx index 15354f86..986a2903 100644 --- a/src/app/compare/vs-onfleet/page.tsx +++ b/src/app/compare/vs-onfleet/page.tsx @@ -8,7 +8,7 @@ import { SoftwareApplicationSchema } from '@/components/seo/json-ld'; export const metadata: Metadata = { title: 'Fleetbase vs Onfleet | Open-Source Onfleet Alternative', description: - 'Compare Fleetbase vs Onfleet. Fleetbase is the open-source Onfleet alternative with no per-task pricing, self-hosting, full API access, and a free tier. See the full feature comparison.', + 'The open-source Onfleet alternative: no per-task pricing, self-hosting, full API access and a free tier. See the full feature comparison.', keywords: [ 'Onfleet alternative', 'Fleetbase vs Onfleet', @@ -112,7 +112,7 @@ export default function VsOnfleetPage() {

@@ -235,7 +235,7 @@ export default function VsOnfleetPage() {

diff --git a/src/app/compare/vs-route4me/page.tsx b/src/app/compare/vs-route4me/page.tsx index f1036d02..767f1a3f 100644 --- a/src/app/compare/vs-route4me/page.tsx +++ b/src/app/compare/vs-route4me/page.tsx @@ -8,7 +8,7 @@ import { Breadcrumbs } from '@/components/ui/breadcrumbs'; export const metadata: Metadata = { title: 'Fleetbase vs Route4Me | Open-Source Route4Me Alternative', description: - 'Compare Fleetbase vs Route4Me. Fleetbase is the open-source Route4Me alternative with full dispatch, fleet management, driver app, and route optimization — no per-route fees.', + 'The open-source Route4Me alternative: dispatch, fleet management, a driver app and route optimization, with no per-route fees.', keywords: [ 'Route4Me alternative', 'Fleetbase vs Route4Me', @@ -112,7 +112,7 @@ export default function VsRoute4MePage() {

@@ -194,7 +194,7 @@ export default function VsRoute4MePage() {

diff --git a/src/app/compare/vs-tookan/page.tsx b/src/app/compare/vs-tookan/page.tsx index 2d9ae911..d08c383b 100644 --- a/src/app/compare/vs-tookan/page.tsx +++ b/src/app/compare/vs-tookan/page.tsx @@ -8,7 +8,7 @@ import { Breadcrumbs } from '@/components/ui/breadcrumbs'; export const metadata: Metadata = { title: 'Fleetbase vs Tookan | Open-Source Tookan Alternative', description: - 'Compare Fleetbase vs Tookan. Fleetbase is the open-source Tookan alternative with no agent-based pricing, self-hosting, full API access, and a complete logistics platform. See the full comparison.', + 'The open-source Tookan alternative: no agent-based pricing, self-hosting, full API access and a complete logistics platform.', keywords: [ 'Tookan alternative', 'Fleetbase vs Tookan', @@ -112,7 +112,7 @@ export default function VsTookanPage() {

@@ -196,7 +196,7 @@ export default function VsTookanPage() {

diff --git a/src/app/contact/sales/page.tsx b/src/app/contact/sales/page.tsx index d62b075c..83b70a5e 100644 --- a/src/app/contact/sales/page.tsx +++ b/src/app/contact/sales/page.tsx @@ -6,7 +6,7 @@ import { Button } from '@/components/ui/button'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/contact/sales' }, - title: 'Contact | Fleetbase', + title: 'Contact', description: 'Get in touch with the Fleetbase team. Email us, book a demo on Cal.com, or join our Discord community. We respond within 1 business day.', keywords: ['fleetbase contact', 'fleetbase demo', 'fleetbase support', 'logistics software enquiry'], @@ -244,7 +244,7 @@ export default function ContactSalesPage() {
- + diff --git a/src/app/developers/api/page.tsx b/src/app/developers/api/page.tsx index 82d6f810..c3b97da4 100644 --- a/src/app/developers/api/page.tsx +++ b/src/app/developers/api/page.tsx @@ -3,9 +3,9 @@ import ApiIntegrationsPageContent from './api-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/developers/api' }, - title: 'API & Integrations — REST, WebSocket & Webhooks | Fleetbase', + title: 'API & Integrations — REST, WebSocket & Webhooks', description: - 'A complete REST API, real-time SocketCluster channels, and event-driven webhooks to integrate Fleetbase with your systems or build new logistics-powered applications.', + 'A complete REST API, real-time SocketCluster channels and event-driven webhooks to integrate Fleetbase with your existing systems.', keywords: [ 'Fleetbase API', 'logistics REST API', diff --git a/src/app/developers/extensions/page.tsx b/src/app/developers/extensions/page.tsx index 95654455..f745ebc5 100644 --- a/src/app/developers/extensions/page.tsx +++ b/src/app/developers/extensions/page.tsx @@ -3,9 +3,9 @@ import DeveloperExtensionsPageContent from './extensions-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/developers/extensions' }, - title: 'Build Extensions — Custom Modules for the Fleetbase Platform | Fleetbase', + title: 'Build Extensions — Custom Platform Modules', description: - 'Build, publish, and distribute Fleetbase extensions using Ember.js and Laravel. Scaffold full-stack modules, backend integrations, and UI components with the Fleetbase CLI.', + 'Build, publish and distribute Fleetbase extensions with Ember.js and Laravel. Scaffold full-stack modules and UI components with the CLI.', keywords: [ 'Fleetbase extensions', 'build Fleetbase extension', diff --git a/src/app/developers/page.tsx b/src/app/developers/page.tsx index 4785a7f8..f1e54ae9 100644 --- a/src/app/developers/page.tsx +++ b/src/app/developers/page.tsx @@ -31,9 +31,9 @@ const CANONICAL = 'https://fleetbase.io/developers'; export const metadata: Metadata = { alternates: { canonical: CANONICAL }, - title: 'Developer Platform — Logistics API, SDKs, Webhooks & Extensions', + title: 'Developer Platform — Logistics API & SDKs', description: - 'Build on the open-source logistics platform. REST API, real-time WebSocket channels, JavaScript and PHP SDKs, webhooks, and a full extension framework — all on the same codebase Fleetbase itself runs on.', + 'Build on the open-source logistics platform: REST API, WebSocket channels, JavaScript and PHP SDKs, webhooks and a full extension framework.', keywords: [ 'logistics API', 'fleet management API', diff --git a/src/app/developers/sdks/page.tsx b/src/app/developers/sdks/page.tsx index 11ef90e4..ba08ed38 100644 --- a/src/app/developers/sdks/page.tsx +++ b/src/app/developers/sdks/page.tsx @@ -3,9 +3,9 @@ import SdksPageContent from './sdks-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/developers/sdks' }, - title: 'SDKs & Libraries — JavaScript, PHP & Storefront | Fleetbase', + title: 'SDKs & Libraries — JavaScript, PHP & Storefront', description: - 'Official Fleetbase client libraries for JavaScript and PHP, plus a dedicated Storefront SDK. Integrate fleet management and logistics into your application in minutes.', + 'Official Fleetbase client libraries for JavaScript and PHP, plus a dedicated Storefront SDK. Integrate logistics into your app in minutes.', keywords: [ 'Fleetbase JavaScript SDK', 'Fleetbase PHP SDK', diff --git a/src/app/developers/webhooks/webhooks-page-content.tsx b/src/app/developers/webhooks/webhooks-page-content.tsx index ef82e54c..6c5437bc 100644 --- a/src/app/developers/webhooks/webhooks-page-content.tsx +++ b/src/app/developers/webhooks/webhooks-page-content.tsx @@ -154,7 +154,7 @@ export default function WebhooksPageContent() { - + @@ -443,7 +443,7 @@ export default function WebhooksPageContent() { Set up your first webhook endpoint in under two minutes from the Fleetbase Developer Console.

- + diff --git a/src/app/docs/(platform)/[[...slug]]/page.tsx b/src/app/docs/(platform)/[[...slug]]/page.tsx index 3e6f4d30..cd87a3b8 100644 --- a/src/app/docs/(platform)/[[...slug]]/page.tsx +++ b/src/app/docs/(platform)/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { source } from '@/lib/source'; export default async function Page(props: { @@ -54,8 +55,9 @@ export async function generateMetadata(props: { const page = source.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs', + slug: params.slug, + }); } diff --git a/src/app/docs/ai/[[...slug]]/page.tsx b/src/app/docs/ai/[[...slug]]/page.tsx index 50e15362..d75b8987 100644 --- a/src/app/docs/ai/[[...slug]]/page.tsx +++ b/src/app/docs/ai/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { aiSource } from '@/lib/source'; export default async function Page(props: { @@ -53,8 +54,9 @@ export async function generateMetadata(props: { const page = aiSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/ai', + slug: params.slug, + }); } diff --git a/src/app/docs/api/[[...slug]]/page.tsx b/src/app/docs/api/[[...slug]]/page.tsx index 7c65b722..2c025846 100644 --- a/src/app/docs/api/[[...slug]]/page.tsx +++ b/src/app/docs/api/[[...slug]]/page.tsx @@ -3,6 +3,7 @@ import { notFound } from 'next/navigation'; import { LanguageTabsProvider } from '@/components/api-reference'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { apiSource } from '@/lib/source'; export default async function Page(props: { @@ -44,8 +45,9 @@ export async function generateMetadata(props: { const page = apiSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/api', + slug: params.slug, + }); } diff --git a/src/app/docs/cli/[[...slug]]/page.tsx b/src/app/docs/cli/[[...slug]]/page.tsx index 97547d95..cefa7c99 100644 --- a/src/app/docs/cli/[[...slug]]/page.tsx +++ b/src/app/docs/cli/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { cliSource } from '@/lib/source'; export default async function Page(props: { @@ -53,8 +54,9 @@ export async function generateMetadata(props: { const page = cliSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/cli', + slug: params.slug, + }); } diff --git a/src/app/docs/contributing/[[...slug]]/page.tsx b/src/app/docs/contributing/[[...slug]]/page.tsx index d8df93b9..7638a5ee 100644 --- a/src/app/docs/contributing/[[...slug]]/page.tsx +++ b/src/app/docs/contributing/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { contributingSource } from '@/lib/source'; export default async function Page(props: { @@ -53,8 +54,9 @@ export async function generateMetadata(props: { const page = contributingSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/contributing', + slug: params.slug, + }); } diff --git a/src/app/docs/extension-development/[[...slug]]/page.tsx b/src/app/docs/extension-development/[[...slug]]/page.tsx index 75618fb6..c76555a7 100644 --- a/src/app/docs/extension-development/[[...slug]]/page.tsx +++ b/src/app/docs/extension-development/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { extensionDevelopmentSource } from '@/lib/source'; export default async function Page(props: { @@ -53,8 +54,9 @@ export async function generateMetadata(props: { const page = extensionDevelopmentSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/extension-development', + slug: params.slug, + }); } diff --git a/src/app/docs/fleet-ops/[[...slug]]/page.tsx b/src/app/docs/fleet-ops/[[...slug]]/page.tsx index a74501f5..3abcfe9e 100644 --- a/src/app/docs/fleet-ops/[[...slug]]/page.tsx +++ b/src/app/docs/fleet-ops/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { fleetOpsSource } from '@/lib/source'; export default async function Page(props: { @@ -53,8 +54,9 @@ export async function generateMetadata(props: { const page = fleetOpsSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/fleet-ops', + slug: params.slug, + }); } diff --git a/src/app/docs/ledger/[[...slug]]/page.tsx b/src/app/docs/ledger/[[...slug]]/page.tsx index a20f55c8..212db8ab 100644 --- a/src/app/docs/ledger/[[...slug]]/page.tsx +++ b/src/app/docs/ledger/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { ledgerSource } from '@/lib/source'; export default async function Page(props: { @@ -53,8 +54,9 @@ export async function generateMetadata(props: { const page = ledgerSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/ledger', + slug: params.slug, + }); } diff --git a/src/app/docs/pallet/[[...slug]]/page.tsx b/src/app/docs/pallet/[[...slug]]/page.tsx index c0efaeea..c3aab22c 100644 --- a/src/app/docs/pallet/[[...slug]]/page.tsx +++ b/src/app/docs/pallet/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { palletSource } from '@/lib/source'; export default async function Page(props: { @@ -53,8 +54,9 @@ export async function generateMetadata(props: { const page = palletSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/pallet', + slug: params.slug, + }); } diff --git a/src/app/docs/storefront/[[...slug]]/page.tsx b/src/app/docs/storefront/[[...slug]]/page.tsx index 34330a8c..a4ebca88 100644 --- a/src/app/docs/storefront/[[...slug]]/page.tsx +++ b/src/app/docs/storefront/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { storefrontSource } from '@/lib/source'; export default async function Page(props: { @@ -53,8 +54,9 @@ export async function generateMetadata(props: { const page = storefrontSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/storefront', + slug: params.slug, + }); } diff --git a/src/app/docs/ui/[[...slug]]/page.tsx b/src/app/docs/ui/[[...slug]]/page.tsx index 93d86ebe..80299bfb 100644 --- a/src/app/docs/ui/[[...slug]]/page.tsx +++ b/src/app/docs/ui/[[...slug]]/page.tsx @@ -7,6 +7,7 @@ import { import { notFound } from 'next/navigation'; import { getMDXComponents } from '@/components/mdx-components'; +import { buildDocsMetadata } from '@/lib/docs-metadata'; import { uiSource } from '@/lib/source'; export default async function Page(props: { @@ -53,8 +54,9 @@ export async function generateMetadata(props: { const page = uiSource.getPage(params.slug); if (!page) notFound(); - return { - title: page.data.title, - description: page.data.description, - }; + return buildDocsMetadata({ + data: page.data, + baseUrl: '/docs/ui', + slug: params.slug, + }); } diff --git a/src/app/licensing/commercial/page.tsx b/src/app/licensing/commercial/page.tsx index b4a24e43..725ce785 100644 --- a/src/app/licensing/commercial/page.tsx +++ b/src/app/licensing/commercial/page.tsx @@ -33,9 +33,9 @@ import { import { Button } from '@/components/ui/button'; export const metadata: Metadata = { - title: 'Commercial License | Fleetbase', + title: 'Commercial License', description: - 'The Fleetbase Commercial License removes AGPL-3.0 copyleft obligations so you can build proprietary modifications, ship SaaS products, white-label deployments, and protect your custom code. Annual, monthly, and perpetual options available.', + 'The Fleetbase Commercial License removes AGPL-3.0 copyleft so you can ship proprietary modifications, SaaS products and white-label deployments.', keywords: [ 'fleetbase commercial license', 'AGPL commercial alternative', diff --git a/src/app/licensing/page.tsx b/src/app/licensing/page.tsx index 5215f9a1..2384ec68 100644 --- a/src/app/licensing/page.tsx +++ b/src/app/licensing/page.tsx @@ -6,9 +6,9 @@ import { Button } from '@/components/ui/button'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/licensing' }, - title: 'Licensing | Fleetbase', + title: 'Licensing', description: - 'Fleetbase is released under AGPL-3.0. If you deploy on a network and make changes, those changes must remain AGPL — or you need a commercial licence to keep them proprietary.', + 'Fleetbase is released under AGPL-3.0. Deploy on a network with changes and they stay AGPL — or take a commercial licence to keep them private.', keywords: ['fleetbase licensing', 'AGPL logistics software', 'open source logistics licence', 'commercial logistics software licence', 'AGPL network copyleft'], openGraph: { title: 'Licensing | Fleetbase', diff --git a/src/app/oli-max/page.tsx b/src/app/oli-max/page.tsx index 35c16d9c..d1ebe09a 100644 --- a/src/app/oli-max/page.tsx +++ b/src/app/oli-max/page.tsx @@ -24,9 +24,9 @@ import { Button } from '@/components/ui/button'; import './oli-max.css'; export const metadata: Metadata = { - title: 'Oli Max × Fleetbase — Bulk Supply Across Mongolia, Powered by Storefront', + title: 'Oli Max — Bulk Supply Across Mongolia', description: - 'Oli Max is the open-source Storefront app deployed at scale by Techbase LLC in Ulaanbaatar — connecting Mongolian restaurants, vendors, and households to bulk meat, flour, rice, oil, and household goods directly from distributors and factories.', + 'Oli Max is an open-source Storefront app deployed at scale in Ulaanbaatar, connecting Mongolian households to bulk goods direct from distributors.', keywords: [ 'Oli Max', 'Techbase LLC', diff --git a/src/app/page.tsx b/src/app/page.tsx index 1975b3e3..31f620f5 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -31,9 +31,9 @@ const DeploymentOptions = dynamic( const FinalCTA = dynamic(() => import('@/components/sections/final-cta')); export const metadata: Metadata = { - title: 'Fleetbase | Open-Source Logistics & Supply Chain Platform', + title: 'Open-Source Logistics & Supply Chain Platform', description: - 'Fleetbase is the open-source logistics OS. Fleet management, e-commerce fulfillment, warehouse, and accounting — one platform, never a per-delivery fee, self-hosted or cloud.', + 'The open-source logistics OS: fleet management, e-commerce fulfilment, warehouse and accounting in one platform. Self-hosted or cloud.', keywords: 'open source logistics platform, fleet management software, TMS software, transportation management system, delivery management, supply chain software, self hosted fleet management, open source logistics, last mile delivery software, route optimization software, warehouse management', alternates: { diff --git a/src/app/partners/page.tsx b/src/app/partners/page.tsx index 337a38aa..7c474f33 100644 --- a/src/app/partners/page.tsx +++ b/src/app/partners/page.tsx @@ -10,9 +10,9 @@ import { Button } from '@/components/ui/button'; const APPLY_URL = 'https://cal.com/shivthakker/enquiry'; export const metadata: Metadata = { - title: 'Partner Program | Fleetbase', + title: 'Partner Program', description: - 'Join the Fleetbase Partner Program — resell and implement, white-label the platform, or build integrations. A flat 20% partner margin on the open-source logistics operating system.', + 'Resell and implement, white-label the platform, or build integrations. A flat 20% partner margin on the open-source logistics operating system.', keywords: [ 'Fleetbase partners', 'fleetbase partner program', diff --git a/src/app/platform/ai/page.tsx b/src/app/platform/ai/page.tsx index a50cafb2..071e70e8 100644 --- a/src/app/platform/ai/page.tsx +++ b/src/app/platform/ai/page.tsx @@ -11,9 +11,9 @@ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/com const AI_REPO = 'https://github.com/fleetbase/ai'; export const metadata: Metadata = { - title: 'Open Source Logistics AI | AI-Powered Fleet & Delivery Management', + title: 'Open-Source Logistics AI for Fleet & Delivery', description: - 'Fleetbase AI is the open-source AI for logistics — live now. Natural-language order creation, order insights, AI route optimization, and operational queries, powered by OpenAI or Claude, on infrastructure you control.', + 'Open-source AI for logistics: natural-language ordering, order insights and AI route optimization, powered by OpenAI or Claude.', keywords: [ 'logistics AI', 'AI fleet management', @@ -245,7 +245,7 @@ export default function LogisticsAIPage() {
@@ -538,7 +538,7 @@ export default function LogisticsAIPage() {

diff --git a/src/app/platform/developer-console/console-page-content.tsx b/src/app/platform/developer-console/console-page-content.tsx index 1cf68df9..b6cdcfbb 100644 --- a/src/app/platform/developer-console/console-page-content.tsx +++ b/src/app/platform/developer-console/console-page-content.tsx @@ -88,7 +88,7 @@ export default function DeveloperConsolePageContent() {

- + @@ -475,7 +475,7 @@ export default function DeveloperConsolePageContent() { Fleetbase into your systems today.

- + diff --git a/src/app/platform/developer-console/page.tsx b/src/app/platform/developer-console/page.tsx index 46de68f2..2e809c2b 100644 --- a/src/app/platform/developer-console/page.tsx +++ b/src/app/platform/developer-console/page.tsx @@ -6,7 +6,7 @@ import DeveloperConsolePageContent from './console-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/developer-console' }, - title: 'Developer Console — API Keys, Webhooks & Monitoring | Fleetbase', + title: 'Developer Console — API Keys & Webhooks', description: 'Manage API keys, configure webhooks, inspect request logs, and monitor real-time socket channels from the Fleetbase Developer Console.', keywords: [ diff --git a/src/app/platform/extensions/extensions-page-content.tsx b/src/app/platform/extensions/extensions-page-content.tsx index a80f4425..c463efb2 100644 --- a/src/app/platform/extensions/extensions-page-content.tsx +++ b/src/app/platform/extensions/extensions-page-content.tsx @@ -157,7 +157,7 @@ export default function ExtensionsMarketplacePageContent() {

- + @@ -295,7 +295,7 @@ export default function ExtensionsMarketplacePageContent() {
- + @@ -653,7 +653,7 @@ export default function ExtensionsMarketplacePageContent() { reach thousands of logistics operators.

- + diff --git a/src/app/platform/extensions/page.tsx b/src/app/platform/extensions/page.tsx index c6a8c1c0..14faf886 100644 --- a/src/app/platform/extensions/page.tsx +++ b/src/app/platform/extensions/page.tsx @@ -6,9 +6,9 @@ import ExtensionsMarketplacePageContent from './extensions-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/extensions' }, - title: 'Extensions Marketplace — Build, Install & Monetize | Fleetbase', + title: 'Extensions Marketplace — Build & Monetize', description: - 'Browse and install extensions from Fleetbase and the open-source community, or publish your own and monetize it to reach thousands of logistics operators worldwide.', + 'Browse and install extensions from Fleetbase and the open-source community, or publish your own and monetise it to operators worldwide.', keywords: [ 'Fleetbase extensions', 'logistics platform extensions', diff --git a/src/app/platform/fleetops/page.tsx b/src/app/platform/fleetops/page.tsx index 1cf1303e..888fc337 100644 --- a/src/app/platform/fleetops/page.tsx +++ b/src/app/platform/fleetops/page.tsx @@ -4,7 +4,7 @@ import FleetOpsPageContent from './fleetops-page-content'; const TITLE = 'Fleet-Ops — Fleet Management & Dispatch Software | Fleetbase'; const DESCRIPTION = - 'Fleet-Ops by Fleetbase is open-source fleet management and dispatch software. Real-time GPS tracking, route optimization, configurable workflows, and automated dispatch — self-hosted or cloud.'; + 'Open-source fleet management and dispatch software. Real-time GPS tracking, route optimization, configurable workflows and automated dispatch.'; const CANONICAL = 'https://fleetbase.io/platform/fleetops'; export const metadata: Metadata = { diff --git a/src/app/platform/ledger/page.tsx b/src/app/platform/ledger/page.tsx index 729a1308..24ca5fe5 100644 --- a/src/app/platform/ledger/page.tsx +++ b/src/app/platform/ledger/page.tsx @@ -6,7 +6,7 @@ import LedgerPageContent from './ledger-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/ledger' }, - title: 'Ledger — Financial Management | Fleetbase Platform', + title: 'Ledger — Financial Management for Logistics', description: 'Fleetbase Ledger gives logistics operators full financial visibility — invoicing, revenue tracking, payment gateways, and chart of accounts.', keywords: 'fleetbase ledger, logistics financial management, fleet invoicing, delivery billing, logistics accounting', openGraph: { diff --git a/src/app/platform/mobile/page.tsx b/src/app/platform/mobile/page.tsx index 1db4f7a4..c4caac81 100644 --- a/src/app/platform/mobile/page.tsx +++ b/src/app/platform/mobile/page.tsx @@ -6,7 +6,7 @@ import MobileAppsPageContent from './mobile-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/mobile' }, - title: 'Mobile Apps — Navigator & Storefront for iOS & Android | Fleetbase', + title: 'Mobile Apps — Navigator & Storefront', description: 'Fleetbase ships two open-source mobile apps — Navigator for drivers and Storefront for customers. White-label them or build your own on the Fleetbase API.', keywords: [ diff --git a/src/app/platform/navigator/page.tsx b/src/app/platform/navigator/page.tsx index b933d178..9705e8b4 100644 --- a/src/app/platform/navigator/page.tsx +++ b/src/app/platform/navigator/page.tsx @@ -6,9 +6,9 @@ import NavigatorPageContent from './navigator-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/navigator' }, - title: 'Navigator — Open-Source Driver App | Fleetbase', + title: 'Navigator — Open-Source Driver App', description: - 'Navigator is Fleetbase\'s open-source mobile app for drivers. Real-time dispatch, turn-by-turn navigation, proof of delivery, and offline support — available on iOS and Android.', + 'The open-source driver app from Fleetbase. Real-time dispatch, turn-by-turn navigation, proof of delivery and offline support, iOS and Android.', keywords: [ 'driver app', 'open source driver app', diff --git a/src/app/platform/page.tsx b/src/app/platform/page.tsx index 48610894..a6ae0898 100644 --- a/src/app/platform/page.tsx +++ b/src/app/platform/page.tsx @@ -6,9 +6,9 @@ import PlatformPageContent from './platform-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform' }, - title: 'Platform Overview — Open-Source Logistics OS | Fleetbase', + title: 'Platform Overview — Open-Source Logistics OS', description: - 'Explore the full Fleetbase platform — Fleet-Ops, Storefront, Ledger, Pallet, Navigator, and more. One modular, open-source logistics OS. Self-host or cloud.', + 'Explore the Fleetbase platform — Fleet-Ops, Storefront, Ledger, Pallet and Navigator. One modular, open-source logistics OS. Self-host or cloud.', keywords: [ 'fleetbase platform', 'open source logistics platform', diff --git a/src/app/platform/pallet/page.tsx b/src/app/platform/pallet/page.tsx index cca4c4b3..d21b487c 100644 --- a/src/app/platform/pallet/page.tsx +++ b/src/app/platform/pallet/page.tsx @@ -6,9 +6,9 @@ import PalletPageContent from './pallet-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/pallet' }, - title: 'Pallet — Open-Source Warehouse Management System | Fleetbase', + title: 'Pallet — Open-Source Warehouse Management System', description: - 'Pallet by Fleetbase is an open-source WMS for inventory management, pick lists, cycle counts, and fulfilment — natively connected to Fleet-Ops dispatch and Storefront orders.', + 'An open-source WMS for inventory, pick lists, cycle counts and fulfilment — natively connected to Fleet-Ops dispatch and Storefront orders.', keywords: [ 'open source warehouse management system', 'WMS software', diff --git a/src/app/platform/platform-page-content.tsx b/src/app/platform/platform-page-content.tsx index fe7001c7..18cc2e1a 100644 --- a/src/app/platform/platform-page-content.tsx +++ b/src/app/platform/platform-page-content.tsx @@ -232,7 +232,7 @@ export default function PlatformPageContent({ stars }: { stars: string }) {

@@ -470,7 +470,7 @@ export default function PlatformPageContent({ stars }: { stars: string }) {

diff --git a/src/app/platform/security/page.tsx b/src/app/platform/security/page.tsx index 708a1ef4..5582c1f2 100644 --- a/src/app/platform/security/page.tsx +++ b/src/app/platform/security/page.tsx @@ -6,9 +6,9 @@ import SecurityCompliancePageContent from './security-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/security' }, - title: 'Security & Compliance — RBAC, Encryption & Audit Logs | Fleetbase', + title: 'Security & Compliance — RBAC & Audit Logs', description: - 'Enterprise-grade security for logistics operations. End-to-end encryption, granular RBAC, MFA, comprehensive audit logs, GDPR compliance, and full self-hosting for data sovereignty.', + 'End-to-end encryption, granular RBAC, MFA, audit logs and GDPR compliance, with full self-hosting for complete data sovereignty.', keywords: [ 'Fleetbase security', 'logistics platform security', diff --git a/src/app/platform/storefront/page.tsx b/src/app/platform/storefront/page.tsx index 380141a4..74cbd47a 100644 --- a/src/app/platform/storefront/page.tsx +++ b/src/app/platform/storefront/page.tsx @@ -6,9 +6,9 @@ import StorefrontPageContent from './storefront-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/storefront' }, - title: 'Storefront — Headless Commerce & Marketplace Platform | Fleetbase', + title: 'Storefront — Headless Commerce Platform', description: - 'Storefront by Fleetbase is open-source headless commerce built for on-demand businesses. Zero commission fees, white-label mobile apps, multi-vendor marketplace, and native Fleet-Ops delivery integration.', + 'Open-source headless commerce for on-demand business. Zero commission, white-label mobile apps, multi-vendor marketplace and native delivery.', keywords: [ 'headless commerce platform', 'online ordering software', diff --git a/src/app/pricing/page.tsx b/src/app/pricing/page.tsx index 2da54326..909a51a6 100644 --- a/src/app/pricing/page.tsx +++ b/src/app/pricing/page.tsx @@ -6,7 +6,7 @@ import { PRICING_FAQS } from './faqs'; import PricingClient from './pricing-client'; const DESCRIPTION = - 'Fleetbase Cloud is $29/month plus $5 per driver or vehicle. Orders are free at any volume — no per-delivery fee. Every module included. Self-hosted implementation from $2,500 one-time.'; + '$29/month plus $5 per driver or vehicle. Orders are free at any volume — no per-delivery fee. Every module included. Self-hosting from $2,500.'; const OG_IMAGE = '/og?title=%2429%20a%20month%2C%20plus%20%245%20per%20driver%20or%20vehicle&eyebrow=Pricing&subtitle=One%20plan.%20Every%20module.%20Orders%20are%20free%20at%20any%20volume.'; diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx index 0cc21e04..cb238530 100644 --- a/src/app/privacy/page.tsx +++ b/src/app/privacy/page.tsx @@ -2,8 +2,8 @@ import type { Metadata } from 'next'; import Link from 'next/link'; export const metadata: Metadata = { - title: 'Privacy Policy | Fleetbase', - description: 'Fleetbase Privacy Policy — how we collect, use, and protect your data when using Fleetbase Cloud and SaaS services.', + title: 'Privacy Policy', + description: 'How Fleetbase collects, uses and protects your data across Fleetbase Cloud, our SaaS services and the Navigator driver app.', alternates: { canonical: 'https://fleetbase.io/privacy' }, openGraph: { title: 'Privacy Policy | Fleetbase', diff --git a/src/app/services/installation/page.tsx b/src/app/services/installation/page.tsx index 7e2c078a..95b484e9 100644 --- a/src/app/services/installation/page.tsx +++ b/src/app/services/installation/page.tsx @@ -16,8 +16,8 @@ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/ import { cn } from '@/lib/utils'; export const metadata: Metadata = { - title: 'Managed Installation Service | Fleetbase', - description: 'Get Fleetbase fully deployed on your own infrastructure in 7 days. Our team handles everything — server deployment, CI/CD, custom branding, DNS, and handover. $2,500 one-time.', + title: 'Managed Installation Service', + description: 'Get Fleetbase deployed on your own infrastructure in 7 days. Server deployment, CI/CD, custom branding, DNS and handover. $2,500 one-time.', keywords: [ 'fleetbase installation service', 'fleetbase deployment', diff --git a/src/app/services/installation/terms/page.tsx b/src/app/services/installation/terms/page.tsx index 61bea719..7b896f89 100644 --- a/src/app/services/installation/terms/page.tsx +++ b/src/app/services/installation/terms/page.tsx @@ -2,7 +2,7 @@ import type { Metadata } from 'next'; import Link from 'next/link'; export const metadata: Metadata = { - title: 'Implementation Terms & Conditions | Fleetbase', + title: 'Implementation Terms & Conditions', description: 'Terms and Conditions governing the Fleetbase Console & Core Implementation service — scope, payment, responsibilities, and legal terms.', alternates: { canonical: 'https://fleetbase.io/services/installation/terms' }, openGraph: { diff --git a/src/app/services/navigator-publishing/page.tsx b/src/app/services/navigator-publishing/page.tsx index 04593b74..48e4a467 100644 --- a/src/app/services/navigator-publishing/page.tsx +++ b/src/app/services/navigator-publishing/page.tsx @@ -47,9 +47,9 @@ const TERMS_DOC = 'https://docs.google.com/document/d/1EweHYp1gkXobOWsNRALW3jE97mR1avMaKpFWsMGM1Io/edit?usp=sharing'; export const metadata: Metadata = { - title: 'Navigator App Publishing Service | Fleetbase', + title: 'Navigator App Publishing Service', description: - 'White-label, build, and ship your own branded Navigator driver app on the App Store and Google Play. We handle scaffolding, branding, store configuration, and submission. Fixed fee, fixed timeline.', + 'Ship your own branded Navigator driver app on the App Store and Google Play. We handle scaffolding, branding, store setup and submission.', keywords: [ 'navigator app publishing', 'white label driver app', diff --git a/src/app/services/page.tsx b/src/app/services/page.tsx index 3119c220..e86e930b 100644 --- a/src/app/services/page.tsx +++ b/src/app/services/page.tsx @@ -11,8 +11,8 @@ import { cn } from '@/lib/utils'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/services' }, - title: 'Services | Fleetbase', - description: 'Explore Fleetbase professional services — implementation, custom development, training, and support. Get expert help to deploy, scale, and customise your logistics platform.', + title: 'Services', + description: 'Fleetbase professional services: implementation, custom development, training and support. Expert help to deploy, scale and customise.', keywords: ['Fleetbase services', 'logistics platform implementation', 'custom development', 'support plans', 'professional services'], openGraph: { title: 'Services | Fleetbase', diff --git a/src/app/services/storefront-publishing/page.tsx b/src/app/services/storefront-publishing/page.tsx index 55af56f6..90bf754f 100644 --- a/src/app/services/storefront-publishing/page.tsx +++ b/src/app/services/storefront-publishing/page.tsx @@ -47,9 +47,9 @@ const TERMS_DOC = 'https://docs.google.com/document/d/17NPti5SXTAMpFHqy7DlF6z73rp5iqYBkSebGk7nzfn8/edit?usp=sharing'; export const metadata: Metadata = { - title: 'Storefront App Publishing Service | Fleetbase', + title: 'Storefront App Publishing Service', description: - 'White-label, build, and ship your own branded Storefront customer app on the App Store and Google Play. We handle scaffolding, branding, payment integration, store configuration, and submission. Fixed fee, fixed timeline.', + 'Ship your own branded Storefront customer app on the App Store and Google Play. Scaffolding, branding, payments, store setup and submission.', keywords: [ 'storefront app publishing', 'white label customer app', diff --git a/src/app/solutions/container-operations/page.tsx b/src/app/solutions/container-operations/page.tsx index fadb95eb..e6cd938a 100644 --- a/src/app/solutions/container-operations/page.tsx +++ b/src/app/solutions/container-operations/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/container-operations' }, - title: 'Container & Port Logistics Software | Fleetbase', - description: 'Full container visibility from port to door. Track containers across multi-modal journeys, manage documentation, coordinate yard operations, and integrate with existing port systems.', + title: 'Container & Port Logistics Software', + description: 'Full container visibility from port to door. Track multi-modal journeys, manage documentation and coordinate yard operations.', keywords: ['container logistics software', 'port logistics management', 'container tracking', 'intermodal logistics', 'yard management software', 'freight forwarding'], openGraph: { title: 'Container Operations Logistics | Fleetbase', diff --git a/src/app/solutions/courier-services/page.tsx b/src/app/solutions/courier-services/page.tsx index efe0bf35..04593e93 100644 --- a/src/app/solutions/courier-services/page.tsx +++ b/src/app/solutions/courier-services/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/courier-services' }, - title: 'Courier & Parcel Delivery Management Software | Fleetbase', - description: 'Maximize first-attempt delivery rates, automate dispatch, and give customers real-time parcel tracking. Open-source courier management software built for scale.', + title: 'Courier & Parcel Delivery Management Software', + description: 'Open-source courier management software. Maximise first-attempt delivery, automate dispatch and give customers real-time parcel tracking.', keywords: ['courier management software', 'parcel delivery platform', 'last mile courier', 'proof of delivery software', 'delivery management system'], openGraph: { title: 'Courier & Parcel Services Software | Fleetbase', diff --git a/src/app/solutions/ecommerce/page.tsx b/src/app/solutions/ecommerce/page.tsx index 62104af6..c80cd096 100644 --- a/src/app/solutions/ecommerce/page.tsx +++ b/src/app/solutions/ecommerce/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/ecommerce' }, - title: 'E-commerce & Retail Delivery Management Software | Fleetbase', - description: 'Power same-day and next-day delivery for your e-commerce or retail operation. Open-source delivery management with headless API, real-time tracking, and returns logistics.', + title: 'E-commerce & Retail Delivery Management Software', + description: 'Open-source delivery management for e-commerce and retail. Same-day and next-day delivery, a headless API, live tracking and returns logistics.', keywords: ['ecommerce delivery software', 'retail logistics platform', 'same-day delivery', 'last mile ecommerce', 'headless delivery API', 'returns management'], openGraph: { title: 'E-commerce & Retail Delivery Software | Fleetbase', diff --git a/src/app/solutions/food-delivery/page.tsx b/src/app/solutions/food-delivery/page.tsx index 9c8efbbc..c65858e1 100644 --- a/src/app/solutions/food-delivery/page.tsx +++ b/src/app/solutions/food-delivery/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/food-delivery' }, - title: 'Food & Grocery Delivery Management Software | Fleetbase', - description: 'Power on-demand food and grocery delivery with real-time dispatch, live customer tracking, and automated notifications. Built for speed, scale, and customer satisfaction.', + title: 'Food & Grocery Delivery Management Software', + description: 'On-demand food and grocery delivery with real-time dispatch, live customer tracking and automated notifications. Built for speed and scale.', keywords: ['food delivery software', 'grocery delivery platform', 'on-demand delivery management', 'restaurant delivery dispatch', 'last mile food delivery'], openGraph: { title: 'Food & Grocery Delivery Software | Fleetbase', diff --git a/src/app/solutions/government/page.tsx b/src/app/solutions/government/page.tsx index bff90c46..d2982971 100644 --- a/src/app/solutions/government/page.tsx +++ b/src/app/solutions/government/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/government' }, - title: 'Military & Government Logistics Software | Fleetbase', - description: 'Open-source logistics platform for military and government operations. Self-hosted, air-gap capable, role-based access, full audit trails, and data sovereignty by design.', + title: 'Military & Government Logistics Software', + description: 'Open-source logistics for military and government operations. Self-hosted, air-gap capable, role-based access and data sovereignty by design.', keywords: ['government logistics software', 'military fleet management', 'secure logistics platform', 'defense logistics software', 'air-gap logistics', 'government transport management'], openGraph: { title: 'Military & Government Logistics | Fleetbase', diff --git a/src/app/solutions/healthcare/page.tsx b/src/app/solutions/healthcare/page.tsx index d926b0e2..dfd75452 100644 --- a/src/app/solutions/healthcare/page.tsx +++ b/src/app/solutions/healthcare/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/healthcare' }, - title: 'Healthcare & Pharmacy Logistics Software | Fleetbase', - description: 'HIPAA-conscious logistics management for healthcare and pharmacy delivery. Chain-of-custody tracking, temperature monitoring, priority dispatch, and encrypted audit trails.', + title: 'Healthcare & Pharmacy Logistics Software', + description: 'HIPAA-conscious logistics for healthcare and pharmacy delivery. Chain-of-custody tracking, temperature monitoring and priority dispatch.', keywords: ['healthcare logistics software', 'pharmacy delivery management', 'medical courier software', 'HIPAA logistics', 'chain of custody tracking', 'cold chain delivery'], openGraph: { title: 'Healthcare & Pharmacy Logistics | Fleetbase', diff --git a/src/app/solutions/page.tsx b/src/app/solutions/page.tsx index 94ca2a2f..e62a5206 100644 --- a/src/app/solutions/page.tsx +++ b/src/app/solutions/page.tsx @@ -23,8 +23,8 @@ import { export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions' }, - title: 'Logistics Solutions by Industry, Use Case & Role | Fleetbase', - description: 'Open-source logistics platform for every operation — trucking, food delivery, healthcare, container logistics, government, and more. Explore solutions by industry, use case, and role.', + title: 'Logistics Solutions by Industry, Use Case & Role', + description: 'Open-source logistics for trucking, food delivery, healthcare, container operations, government and more. Browse by industry, use case or role.', keywords: ['logistics software solutions', 'fleet management platform', 'delivery management software', 'open source logistics', 'logistics by industry'], openGraph: { title: 'Logistics Solutions by Industry, Use Case & Role | Fleetbase', @@ -310,7 +310,7 @@ export default function SolutionsPage() {

Start Free Trial diff --git a/src/app/solutions/roles/customer-success/page.tsx b/src/app/solutions/roles/customer-success/page.tsx index 525490a1..498f7fb1 100644 --- a/src/app/solutions/roles/customer-success/page.tsx +++ b/src/app/solutions/roles/customer-success/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/roles/customer-success' }, - title: 'Customer Support Tools for Logistics | Fleetbase', - description: 'Give customer success teams real-time order visibility, live tracking links, and instant proof of delivery — so they can resolve customer queries in seconds, not hours.', + title: 'Customer Support Tools for Logistics', + description: 'Real-time order visibility, live tracking links and instant proof of delivery, so support teams resolve customer queries in seconds.', keywords: ['customer support logistics software', 'delivery tracking for support teams', 'order visibility customer service', 'proof of delivery customer support', 'logistics customer portal'], openGraph: { title: 'Customer Support Tools for Logistics | Fleetbase', diff --git a/src/app/solutions/roles/developers/page.tsx b/src/app/solutions/roles/developers/page.tsx index 26c4605c..f4688db5 100644 --- a/src/app/solutions/roles/developers/page.tsx +++ b/src/app/solutions/roles/developers/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/roles/developers' }, - title: 'Logistics Platform for Developers & Engineering Teams | Fleetbase', - description: 'Open-source, API-first logistics platform built for developers. Full REST API, real-time webhooks, Extensions SDK, self-hosted deployment, and complete source code access.', + title: 'Logistics Platform for Developers', + description: 'An open-source, API-first logistics platform. Full REST API, real-time webhooks, an Extensions SDK, self-hosting and complete source access.', keywords: ['logistics API for developers', 'open source logistics platform', 'fleet management API', 'logistics developer tools', 'self-hosted logistics software', 'logistics SDK'], openGraph: { title: 'Logistics Platform for Developers | Fleetbase', diff --git a/src/app/solutions/roles/executives/page.tsx b/src/app/solutions/roles/executives/page.tsx index cbc8c017..483d0199 100644 --- a/src/app/solutions/roles/executives/page.tsx +++ b/src/app/solutions/roles/executives/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/roles/executives' }, - title: 'Logistics Platform for Executives & Business Leaders | Fleetbase', - description: 'Give leadership real-time visibility into logistics performance, cost efficiency, and growth metrics. Open-source logistics infrastructure that scales without vendor lock-in.', + title: 'Logistics Platform for Executives', + description: 'Real-time visibility into logistics performance, cost efficiency and growth. Open-source infrastructure that scales without vendor lock-in.', keywords: ['logistics software for executives', 'logistics ROI platform', 'logistics cost reduction', 'supply chain executive dashboard', 'logistics business intelligence', 'fleet cost management'], openGraph: { title: 'Logistics Platform for Executives | Fleetbase', diff --git a/src/app/solutions/roles/fleet-managers/page.tsx b/src/app/solutions/roles/fleet-managers/page.tsx index 82b269ec..7dc523f6 100644 --- a/src/app/solutions/roles/fleet-managers/page.tsx +++ b/src/app/solutions/roles/fleet-managers/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/roles/fleet-managers' }, - title: 'Fleet Management Software for Fleet Managers | Fleetbase', - description: 'Complete visibility over vehicle health, compliance, driver performance, and real-time locations — all from one open-source fleet management platform built for fleet managers.', + title: 'Fleet Management Software for Fleet Managers', + description: 'Open-source fleet management for fleet managers: vehicle health, compliance, driver performance and real-time locations in one platform.', keywords: ['fleet management software', 'fleet manager tools', 'vehicle compliance tracking', 'fleet maintenance platform', 'driver performance management', 'vehicle tracking fleet manager'], openGraph: { title: 'Fleet Management Software for Fleet Managers | Fleetbase', diff --git a/src/app/solutions/roles/operations-managers/page.tsx b/src/app/solutions/roles/operations-managers/page.tsx index 23485579..efa55ebe 100644 --- a/src/app/solutions/roles/operations-managers/page.tsx +++ b/src/app/solutions/roles/operations-managers/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/roles/operations-managers' }, - title: 'Logistics Software for Operations Managers | Fleetbase', - description: 'Give operations managers a single dashboard to oversee dispatch, monitor SLAs, manage exceptions, and report on performance — without switching between systems.', + title: 'Logistics Software for Operations Managers', + description: 'One dashboard to oversee dispatch, monitor SLAs, manage exceptions and report on performance, without switching between systems.', keywords: ['logistics software for operations managers', 'operations management platform', 'logistics operations dashboard', 'dispatch management software', 'SLA monitoring software'], openGraph: { title: 'Logistics Software for Operations Managers | Fleetbase', diff --git a/src/app/solutions/roles/warehouse-managers/page.tsx b/src/app/solutions/roles/warehouse-managers/page.tsx index 134dff7e..e896d1fb 100644 --- a/src/app/solutions/roles/warehouse-managers/page.tsx +++ b/src/app/solutions/roles/warehouse-managers/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/roles/warehouse-managers' }, - title: 'Warehouse Management Software | Fleetbase', - description: 'Connect your warehouse to your delivery operation with Fleetbase Pallet WMS. Manage inventory, pick-and-pack workflows, and outbound dispatch from one integrated platform.', + title: 'Warehouse Management Software', + description: 'Connect your warehouse to your delivery operation with Pallet WMS. Inventory, pick-and-pack workflows and outbound dispatch in one platform.', keywords: ['warehouse management software', 'WMS for logistics', 'inventory management platform', 'pick and pack software', 'warehouse to delivery integration', 'pallet WMS'], openGraph: { title: 'Warehouse Management Software | Fleetbase', diff --git a/src/app/solutions/trucking/page.tsx b/src/app/solutions/trucking/page.tsx index eb85facb..1b8a6d0f 100644 --- a/src/app/solutions/trucking/page.tsx +++ b/src/app/solutions/trucking/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/trucking' }, - title: 'Fleet Management Software for Trucking & Haulage | Fleetbase', - description: 'Replace your legacy TMS with open-source fleet management built for trucking and haulage. Real-time tracking, route optimization, digital POD, and compliance tools — on infrastructure you own.', + title: 'Fleet Management Software for Trucking & Haulage', + description: 'Replace your legacy TMS with open-source fleet management for trucking and haulage. Live tracking, route optimization, digital POD and compliance.', keywords: ['trucking software', 'haulage management', 'fleet management TMS', 'freight tracking', 'route optimization trucking', 'open source TMS'], openGraph: { title: 'Trucking & Haulage Fleet Management | Fleetbase', diff --git a/src/app/solutions/use-cases/analytics/page.tsx b/src/app/solutions/use-cases/analytics/page.tsx index 3c41657f..8110ec13 100644 --- a/src/app/solutions/use-cases/analytics/page.tsx +++ b/src/app/solutions/use-cases/analytics/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/use-cases/analytics' }, - title: 'Logistics Analytics & Reporting | Fleetbase', - description: 'Turn logistics data into decisions. Live dashboards, KPI tracking, cost analysis, and exportable reports for fleet performance, delivery SLAs, driver metrics, and operational costs.', + title: 'Logistics Analytics & Reporting', + description: 'Turn logistics data into decisions. Live dashboards, KPI tracking, cost analysis and exportable reports on fleet, SLA and driver performance.', keywords: ['logistics analytics software', 'fleet performance dashboard', 'delivery KPI tracking', 'logistics reporting platform', 'supply chain analytics', 'fleet cost analysis'], openGraph: { title: 'Logistics Analytics & Reporting | Fleetbase', diff --git a/src/app/solutions/use-cases/fleet-management/page.tsx b/src/app/solutions/use-cases/fleet-management/page.tsx index 3fa1e03f..4c0f31e6 100644 --- a/src/app/solutions/use-cases/fleet-management/page.tsx +++ b/src/app/solutions/use-cases/fleet-management/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/use-cases/fleet-management' }, - title: 'Fleet Management Software | Fleetbase', - description: 'Monitor vehicle health, driver performance, and fleet utilization from one dashboard. Open-source fleet management with real-time tracking, maintenance scheduling, and compliance tools.', + title: 'Fleet Management Software', + description: 'Open-source fleet management: vehicle health, driver performance and utilisation in one dashboard, with maintenance scheduling and compliance.', keywords: ['fleet management software', 'vehicle tracking system', 'fleet maintenance software', 'driver management platform', 'fleet compliance software', 'vehicle health monitoring'], openGraph: { title: 'Fleet Management Software | Fleetbase', diff --git a/src/app/solutions/use-cases/integrations/page.tsx b/src/app/solutions/use-cases/integrations/page.tsx index a632c9be..b06cacfb 100644 --- a/src/app/solutions/use-cases/integrations/page.tsx +++ b/src/app/solutions/use-cases/integrations/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/use-cases/integrations' }, - title: 'Logistics API & Integrations | Fleetbase', - description: 'Connect Fleetbase to your entire tech stack with a full REST API, real-time webhooks, and pre-built integrations. Open-source logistics platform built to fit your existing workflows.', + title: 'Logistics API & Integrations', + description: 'Connect Fleetbase to your stack with a full REST API, real-time webhooks and pre-built integrations that fit your existing workflows.', keywords: ['logistics API', 'fleet management API', 'logistics integration platform', 'delivery API', 'logistics webhook integration', 'headless logistics platform'], openGraph: { title: 'Logistics API & Integrations | Fleetbase', diff --git a/src/app/solutions/use-cases/last-mile-delivery/page.tsx b/src/app/solutions/use-cases/last-mile-delivery/page.tsx index 07f06606..bb439508 100644 --- a/src/app/solutions/use-cases/last-mile-delivery/page.tsx +++ b/src/app/solutions/use-cases/last-mile-delivery/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/use-cases/last-mile-delivery' }, - title: 'Last-Mile Delivery Software | Fleetbase', - description: 'Cut failed deliveries, automate dispatch, and give customers real-time tracking. Open-source last-mile logistics platform with smart routing, digital POD, and branded tracking pages.', + title: 'Last-Mile Delivery Software', + description: 'Open-source last-mile delivery software. Cut failed deliveries, automate dispatch, and give customers smart routing and live tracking pages.', keywords: ['last mile delivery software', 'last mile logistics platform', 'delivery management system', 'final mile delivery', 'delivery dispatch software', 'proof of delivery'], openGraph: { title: 'Last-Mile Delivery Software | Fleetbase', diff --git a/src/app/solutions/use-cases/order-management/page.tsx b/src/app/solutions/use-cases/order-management/page.tsx index 59b88020..59d091db 100644 --- a/src/app/solutions/use-cases/order-management/page.tsx +++ b/src/app/solutions/use-cases/order-management/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/use-cases/order-management' }, - title: 'Order Management Software | Fleetbase', - description: 'Configure, track, and fulfill any order type with custom workflows, statuses, and fields. Open-source order management that adapts to your logistics operation — not the other way around.', + title: 'Order Management Software', + description: 'Configure, track and fulfil any order type with custom workflows, statuses and fields. Open-source order management that adapts to you.', keywords: ['order management software', 'logistics order management', 'custom order workflows', 'order fulfillment platform', 'order tracking system', 'delivery order management'], openGraph: { title: 'Order Management Software | Fleetbase', diff --git a/src/app/solutions/use-cases/route-optimization/page.tsx b/src/app/solutions/use-cases/route-optimization/page.tsx index ab752ae7..4ed87aed 100644 --- a/src/app/solutions/use-cases/route-optimization/page.tsx +++ b/src/app/solutions/use-cases/route-optimization/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/use-cases/route-optimization' }, - title: 'Route Optimization Software | Fleetbase', - description: 'Cut fuel costs by 28% and improve on-time rates with intelligent multi-stop route optimization. Real-time traffic, time windows, vehicle capacity — all factored in automatically.', + title: 'Route Optimization Software', + description: 'Open-source route optimization software. Intelligent multi-stop routing that factors in live traffic, time windows and vehicle capacity.', keywords: ['route optimization software', 'delivery route planner', 'multi-stop route optimization', 'fleet route planning', 'dynamic route optimization', 'last mile routing'], openGraph: { title: 'Route Optimization Software | Fleetbase', diff --git a/src/app/solutions/waste-management/page.tsx b/src/app/solutions/waste-management/page.tsx index ad15a88f..17af580a 100644 --- a/src/app/solutions/waste-management/page.tsx +++ b/src/app/solutions/waste-management/page.tsx @@ -4,8 +4,8 @@ import SolutionPageLayout from '@/components/solutions/solution-page-layout'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/solutions/waste-management' }, - title: 'Waste & Recycling Fleet Management Software | Fleetbase', - description: 'Optimize waste collection routes, reduce fuel costs, track containers, and generate compliance reports automatically. Open-source fleet management built for waste and recycling operations.', + title: 'Waste & Recycling Fleet Management Software', + description: 'Open-source fleet management for waste and recycling. Optimise collection routes, cut fuel costs, track containers and report on compliance.', keywords: ['waste management software', 'recycling fleet management', 'waste collection routing', 'bin tracking software', 'refuse logistics platform'], openGraph: { title: 'Waste & Recycling Operations Software | Fleetbase', diff --git a/src/app/terms/page.tsx b/src/app/terms/page.tsx index 3db4422f..232813ac 100644 --- a/src/app/terms/page.tsx +++ b/src/app/terms/page.tsx @@ -2,7 +2,7 @@ import type { Metadata } from 'next'; import Link from 'next/link'; export const metadata: Metadata = { - title: 'Terms of Service | Fleetbase', + title: 'Terms of Service', description: 'Fleetbase Terms of Service for SaaS and Cloud customers. Read our terms covering usage, data, billing, and your rights as a customer.', alternates: { canonical: 'https://fleetbase.io/terms' }, openGraph: { diff --git a/src/app/true-vegan/page.tsx b/src/app/true-vegan/page.tsx index fdfbd9cf..13dccb8e 100644 --- a/src/app/true-vegan/page.tsx +++ b/src/app/true-vegan/page.tsx @@ -22,9 +22,9 @@ import { Button } from '@/components/ui/button'; import './true-vegan.css'; export const metadata: Metadata = { - title: 'True Vegan × Fleetbase — Plant-Based Dining, Delivered on Storefront', + title: 'True Vegan — Plant-Based Dining, Delivered', description: - 'True Vegan, by Chef Rahein, brings plant-based dining to Delray Beach with a branded Storefront customer app — pickup, delivery, and Stripe checkout, all powered by Fleetbase.', + 'True Vegan brings plant-based dining to Delray Beach with a branded Storefront app — pickup, delivery and Stripe checkout, powered by Fleetbase.', keywords: [ 'True Vegan', 'Chef Rahein', diff --git a/src/components/layout/footer.tsx b/src/components/layout/footer.tsx index a296210a..d7acf7db 100644 --- a/src/components/layout/footer.tsx +++ b/src/components/layout/footer.tsx @@ -148,7 +148,7 @@ const Footer = () => { { data-cta-id={button.ctaId} data-cta-location="navbar_mobile" data-cta-variant="primary" - {...(button.external && { target: "_blank", rel: "noopener noreferrer" })} + {...(button.external && { target: "_blank" })} + rel={relForHref( + button.href, + button.external ? 'noopener noreferrer' : undefined, + )} > {button.icon && } {button.label} @@ -861,7 +866,11 @@ const Navbar = () => { data-cta-id={button.ctaId} data-cta-location="navbar" data-cta-variant="primary" - {...(button.external && { target: "_blank", rel: "noopener noreferrer" })} + {...(button.external && { target: "_blank" })} + rel={relForHref( + button.href, + button.external ? 'noopener noreferrer' : undefined, + )} > {button.icon && } {button.label} diff --git a/src/components/placeholder-page.tsx b/src/components/placeholder-page.tsx index 96742774..4fe11ffa 100644 --- a/src/components/placeholder-page.tsx +++ b/src/components/placeholder-page.tsx @@ -29,7 +29,7 @@ export default function PlaceholderPage({

{ctaSecondary && ctaSecondaryHref && ( )}
diff --git a/src/lib/docs-metadata.ts b/src/lib/docs-metadata.ts new file mode 100644 index 00000000..bef4bef5 --- /dev/null +++ b/src/lib/docs-metadata.ts @@ -0,0 +1,63 @@ +import type { Metadata } from 'next'; + +import { titleWithinLimit, truncateAtWord } from '@/lib/seo-text'; + +const BASE_URL = 'https://fleetbase.io'; + +// Docs pages carried a bare title and description — no canonical, no Open Graph +// — so every documentation link shared into Slack, LinkedIn or a GitHub issue +// rendered as a naked URL. Docs are the bulk of the site's indexable content +// and the pages developers actually pass around, so they get the same treatment +// as marketing pages: one branded card, built from the page's own frontmatter. +type DocsPageData = { + title?: string; + description?: string; +}; + +/** + * Build the metadata for one docs page. + * + * `baseUrl` is the docs source's mount point (`/docs/pallet`), and `slug` is the + * catch-all segment array, so the two together reconstruct the canonical path. + */ +export function buildDocsMetadata({ + data, + baseUrl, + slug, +}: { + data: DocsPageData; + baseUrl: string; + slug?: string[]; +}): Metadata { + const title = data.title ?? 'Documentation'; + const description = data.description + ? truncateAtWord(data.description) + : 'Documentation for Fleetbase, the open-source logistics and supply chain platform.'; + + const path = [baseUrl, ...(slug ?? [])].join('/').replace(/\/+/g, '/'); + const canonical = `${BASE_URL}${path}`; + + const ogImage = `${BASE_URL}/og?title=${encodeURIComponent( + title, + )}&eyebrow=Docs&subtitle=${encodeURIComponent(description)}`; + + return { + title: titleWithinLimit(title), + description, + alternates: { canonical }, + openGraph: { + type: 'article', + url: canonical, + title, + description, + siteName: 'Fleetbase', + images: [{ url: ogImage, width: 1200, height: 630, alt: title }], + }, + twitter: { + card: 'summary_large_image', + title, + description, + images: [ogImage], + }, + }; +} diff --git a/src/lib/external-link.ts b/src/lib/external-link.ts new file mode 100644 index 00000000..bfcd3c61 --- /dev/null +++ b/src/lib/external-link.ts @@ -0,0 +1,32 @@ +// Hosts we link to heavily but do not want to hand link equity to. +// +// The console is the single largest recipient of internal links on the site — +// /onboard alone takes 514 of them, because every "Get started" CTA points +// there. Those are app screens, not content: they carry no ranking value of +// their own, so the authority that flows into them is authority that never +// reaches the pages built to win buyers. The console is separately marked +// noindex; nofollow here stops the marketing site from feeding it in the first +// place. +const NO_EQUITY_HOSTS = ['console.fleetbase.io']; + +function isNoEquityHref(href: string) { + return NO_EQUITY_HOSTS.some( + (host) => href.startsWith(`https://${host}`) || href.startsWith(`http://${host}`), + ); +} + +/** + * Build the `rel` value for an outbound link, preserving whatever the call site + * already set and appending `nofollow` for hosts we deliberately do not pass + * authority to. Returns `undefined` when there is nothing to set, so callers can + * spread it onto an element without emitting an empty attribute. + */ +export function relForHref(href: string, existingRel?: string) { + const tokens = new Set((existingRel ?? '').split(/\s+/).filter(Boolean)); + + if (isNoEquityHref(href)) { + tokens.add('nofollow'); + } + + return tokens.size > 0 ? Array.from(tokens).join(' ') : undefined; +} diff --git a/src/lib/ghost.ts b/src/lib/ghost.ts index 93bf5444..1aa8c454 100644 --- a/src/lib/ghost.ts +++ b/src/lib/ghost.ts @@ -107,8 +107,8 @@ function buildGhostUrl(pathname: string, params: Record) { return `${apiUrl}/ghost/api/content/${pathname}?${searchParams.toString()}`; } -async function fetchGhost(pathname: string, params: Record) { - const response = await fetch(buildGhostUrl(pathname, params), { +async function requestGhost(pathname: string, params: Record) { + return fetch(buildGhostUrl(pathname, params), { headers: { Accept: 'application/json', 'Accept-Version': GHOST_API_VERSION, @@ -117,6 +117,34 @@ async function fetchGhost(pathname: string, params: Record) { revalidate: BLOG_REVALIDATE_SECONDS, }, }); +} + +async function fetchGhost(pathname: string, params: Record) { + const response = await requestGhost(pathname, params); + + if (!response.ok) { + throw new Error( + `Ghost Content API request failed for ${pathname} with status ${response.status}.`, + ); + } + + return (await response.json()) as T; +} + +// Ghost answers an unknown resource with a 404. For a lookup by slug that is a +// normal "no such post" answer rather than a failure, so it must not throw: +// doing so turned every bad /blog/* URL into a 500 — including +// /blog/robots.txt, which Ahrefs flagged and which makes crawlers treat the +// whole host as unhealthy. Any other non-OK status is still a real error. +async function fetchGhostAllowingMissing( + pathname: string, + params: Record, +) { + const response = await requestGhost(pathname, params); + + if (response.status === 404) { + return null; + } if (!response.ok) { throw new Error( @@ -224,7 +252,7 @@ export async function getAllBlogPosts() { } export async function getBlogPostBySlug(slug: string) { - const response = await fetchGhost( + const response = await fetchGhostAllowingMissing( `posts/slug/${encodeURIComponent(slug)}/`, { include: 'authors,tags', @@ -232,7 +260,7 @@ export async function getBlogPostBySlug(slug: string) { }, ); - const post = response.posts[0]; + const post = response?.posts[0]; return post ? normalizePost(post) : null; } diff --git a/src/lib/seo-text.ts b/src/lib/seo-text.ts new file mode 100644 index 00000000..402b748e --- /dev/null +++ b/src/lib/seo-text.ts @@ -0,0 +1,44 @@ +// Search engines truncate what they show. These limits are where Google starts +// cutting in practice, and Ahrefs flags anything past them. +// +// The brand suffix is appended by the `title.template` in the root layout, so a +// page's own title has TITLE_LIMIT - BRAND_SUFFIX.length characters to work with +// before the rendered runs long. +export const BRAND_SUFFIX = ' | Fleetbase'; +export const TITLE_LIMIT = 60; +export const DESCRIPTION_LIMIT = 155; + +/** + * Cut `text` to at most `limit` characters, breaking on a word boundary and + * adding an ellipsis when anything was removed. Collapses whitespace first so + * excerpts pulled out of HTML don't carry newlines into the meta tag. + */ +export function truncateAtWord(text: string, limit = DESCRIPTION_LIMIT) { + const normalized = text.replace(/\s+/g, ' ').trim(); + + if (normalized.length <= limit) { + return normalized; + } + + // Leave room for the ellipsis, then step back to the last space so we never + // cut a word in half. + const hardCut = normalized.slice(0, limit - 1); + const lastSpace = hardCut.lastIndexOf(' '); + const body = (lastSpace > limit * 0.6 ? hardCut.slice(0, lastSpace) : hardCut) + // Trailing punctuation before an ellipsis reads as a typo. + .replace(/[\s,;:.!?—–-]+$/, ''); + + return `${body}…`; +} + +/** + * Blog headlines are written for readers, not for the 60-character budget, and + * shortening them would damage the page. The plan's guidance is to drop the + * brand suffix instead: return an `absolute` title, which tells Next.js to skip + * the layout's template for this page only. + */ +export function titleWithinLimit(title: string) { + return title.length + BRAND_SUFFIX.length > TITLE_LIMIT + ? { absolute: title } + : title; +} diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 00000000..7954f9fc --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,40 @@ +import { type NextRequest, NextResponse } from 'next/server'; + +// Tracking parameters that identify where a visit came from but never change +// what the page renders. Links from the old blog subdomain append +// ?ref=blog.fleetbase.io, which gave crawlers a second, indexable copy of every +// high-value marketing page. Canonical tags already point at the clean path, so +// this is belt-and-braces: redirect the parameter away before a crawler can +// treat the URL as a page in its own right. +// +// The HTTP Referer header still carries the referral, so analytics attribution +// is unaffected. +const STRIPPED_QUERY_PARAMS = ['ref']; + +export function middleware(request: NextRequest) { + const url = request.nextUrl.clone(); + const stripped = STRIPPED_QUERY_PARAMS.filter((param) => + url.searchParams.has(param), + ); + + if (stripped.length === 0) { + return NextResponse.next(); + } + + for (const param of stripped) { + url.searchParams.delete(param); + } + + // 308 rather than 302: the clean path is the permanent home of the content, + // and it preserves the request method. + return NextResponse.redirect(url, 308); +} + +export const config = { + // Skip API routes, Next internals and static assets — none of them are + // indexable, and keeping them out avoids paying middleware latency on every + // asset request. + matcher: [ + '/((?!api/|ingest/|gtm/|g/collect|_next/static|_next/image|images/|favicon).*)', + ], +}; From 47dcc840e5ca2b84be0f753fe76d532a05c404a9 Mon Sep 17 00:00:00 2001 From: Shiv Thakker <shiv@fleetbase.io> Date: Thu, 3 Sep 2026 13:15:54 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(seo):=20phase=203=20=E2=80=94=20links,?= =?UTF-8?q?=20assets,=20docs=20headings,=20blog=20caching?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SEO-08 Point internal links at final URLs. Verified each redirect against the live site first — several went somewhere other than the plan assumed (/docs/fleet-ops/orders lands on /docs/fleet-ops/operations/orders/overview, not /orders/overview). Rewrote 10 files, fixed the two internal 404s, and removed the Bringg card from /compare, which linked to a redirect back to the page the visitor was already on. Growth plan GP-05 restores it as a real page. Not done: the 20 external 4XX links. That list only exists in the Ahrefs export, which is not in the repo. SEO-09 Self-host the integration icons. All four broken logos already existed under public/images/integrations — the component was simply pointing at the CDN. Repointed all 26 references and self-hosted the remaining 18 (Simple Icons, CC0) so a sales page does not depend on a CDN that renamed these slugs once already. SEO-10 One H1 per docs page. Not a Docusaurus swizzle — the docs are fumadocs. fumadocs renders the frontmatter title as an h1 and 354 MDX files then opened with their own "# " heading, which is the same text 269 times over. Removed the redundant body heading from 343 files; the 11 section roots keep theirs, because those routes skip DocsTitle and it is their only h1. SEO-11 Cache blog pages at the edge. The blog was already on ISR, so the plan's "rendered on every request" diagnosis was wrong. The real cost was a 5-minute revalidate window: raised to an hour and paired with s-maxage=3600 plus stale-while-revalidate so the CDN never makes a reader wait on a cold render. SEO-12 Link the sales pages from where the authority is. The role and use-case pages had one inbound link each because they lived only in the nav dropdown. Added a footer column covering all twelve, a homepage section linking the three compare pages and every role and use-case page in body copy, and a RelatedPages component that cross-links platform modules to the roles and industries that buy them. It looks itself up by pathname, so pairings live in one map instead of thirty page components. Also caught in review: /platform/fleetops kept a doubled brand suffix because its title came from a const shared with the social tags, and two further titles repeated the brand mid-string. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --- content/docs/apps/index.mdx | 2 - .../docs/apps/navigator-app/customization.mdx | 2 - content/docs/apps/navigator-app/index.mdx | 2 - content/docs/apps/navigator-app/overview.mdx | 2 - content/docs/apps/navigator-app/setup.mdx | 2 - .../apps/storefront-app/customization.mdx | 2 - content/docs/apps/storefront-app/index.mdx | 2 - content/docs/apps/storefront-app/overview.mdx | 2 - content/docs/apps/storefront-app/setup.mdx | 2 - content/docs/cli/account/generate-token.mdx | 2 - content/docs/cli/account/login.mdx | 2 - content/docs/cli/account/register.mdx | 2 - .../docs/cli/account/resend-verification.mdx | 2 - content/docs/cli/account/set-auth.mdx | 2 - content/docs/cli/account/verify.mdx | 2 - .../extension-development/bundle-upload.mdx | 2 - .../docs/cli/extension-development/bundle.mdx | 2 - .../cli/extension-development/overview.mdx | 2 - .../cli/extension-development/publish.mdx | 2 - .../cli/extension-development/scaffold.mdx | 2 - .../cli/extension-development/unpublish.mdx | 2 - .../extension-development/version-bump.mdx | 2 - content/docs/cli/extensions/install.mdx | 2 - content/docs/cli/extensions/search.mdx | 2 - content/docs/cli/extensions/uninstall.mdx | 2 - content/docs/cli/getting-started/commands.mdx | 2 - .../docs/cli/getting-started/installation.mdx | 2 - .../docs/cli/getting-started/requirements.mdx | 2 - content/docs/cli/installation/overview.mdx | 2 - content/docs/community/changelog.mdx | 2 - content/docs/community/discord.mdx | 2 - content/docs/community/faq.mdx | 2 - content/docs/community/github-discussions.mdx | 2 - content/docs/community/index.mdx | 2 - content/docs/community/licensing.mdx | 2 - content/docs/community/support-plans.mdx | 2 - content/docs/contributing/code.mdx | 2 - content/docs/contributing/documentation.mdx | 2 - content/docs/contributing/extensions.mdx | 4 +- .../docs/contributing/reporting-issues.mdx | 2 - .../contributing/translations/file-format.mdx | 2 - .../contributing/translations/glossary.mdx | 2 - .../docs/contributing/translations/index.mdx | 2 - .../translations/repositories.mdx | 2 - .../docs/contributing/translations/setup.mdx | 4 +- .../contributing/translations/submitting.mdx | 2 - .../backend-development.mdx | 2 - .../extending-fleetbase/dashboard-widgets.mdx | 2 - .../extension-architecture.mdx | 2 - .../frontend-development.mdx | 2 - .../hooks-and-lifecycle.mdx | 2 - content/docs/extending-fleetbase/index.mdx | 2 - .../menus-and-navigation.mdx | 2 - content/docs/extending-fleetbase/overview.mdx | 2 - .../publishing-to-marketplace.mdx | 2 - .../registering-components.mdx | 2 - .../scaffolding-your-extension.mdx | 2 - .../extending-fleetbase/virtual-routes.mdx | 2 - .../architecture/extension-registration.mdx | 2 - .../architecture/overview.mdx | 2 - .../backend/expansions-and-observers.mdx | 2 - .../backend/migrations.mdx | 2 - .../backend/routes-and-controllers.mdx | 2 - .../backend/service-provider.mdx | 2 - .../frontend/routing.mdx | 2 - .../frontend/templates-and-components.mdx | 2 - .../frontend/virtual-routes.mdx | 2 - .../getting-started/extension-anatomy.mdx | 2 - .../getting-started/quickstart.mdx | 2 - .../publishing/overview.mdx | 2 - .../adding-a-payment-gateway-driver.mdx | 2 - .../recipes/adding-a-sms-provider.mdx | 2 - .../recipes/adding-an-integrated-vendor.mdx | 2 - .../recipes/calling-your-extension-api.mdx | 2 - .../recipes/connecting-models-to-your-api.mdx | 2 - .../recipes/registering-a-report-schema.mdx | 2 - .../recipes/registering-notifications.mdx | 2 - .../reference/api-services.mdx | 2 - .../reference/contracts.mdx | 2 - .../reference/decorators.mdx | 2 - .../reference/ember-services.mdx | 2 - .../universe/extension-manager.mdx | 2 - .../universe/hook-service.mdx | 2 - .../universe/menu-service.mdx | 2 - .../universe/overview.mdx | 2 - .../universe/registry-service.mdx | 2 - .../universe/widget-service.mdx | 2 - content/docs/fleet-ops/analytics/overview.mdx | 2 - .../fleet-ops/analytics/reports/overview.mdx | 2 - .../connectivity/devices/overview.mdx | 2 - .../connectivity/events/overview.mdx | 2 - .../docs/fleet-ops/connectivity/overview.mdx | 2 - .../connectivity/sensors/overview.mdx | 2 - .../connectivity/telematics/overview.mdx | 2 - .../getting-started/core-concepts.mdx | 2 - .../getting-started/navigator-app-setup.mdx | 2 - .../fleet-ops/getting-started/quickstart.mdx | 2 - .../maintenance/equipment/overview.mdx | 2 - .../docs/fleet-ops/maintenance/overview.mdx | 2 - .../fleet-ops/maintenance/parts/overview.mdx | 2 - .../maintenance/schedules/overview.mdx | 2 - .../maintenance/work-orders/overview.mdx | 2 - .../navigator-app/build-and-release.mdx | 2 - .../fleet-ops/navigator-app/configuration.mdx | 2 - .../fleet-ops/navigator-app/quickstart.mdx | 2 - .../docs/fleet-ops/navigator-app/theming.mdx | 2 - .../operations/orchestrator/overview.mdx | 2 - .../payload-capacity-allocation.mdx | 2 - .../orchestrator/vehicle-allocation.mdx | 2 - .../operations/orchestrator/workbench.mdx | 2 - .../order-configurations/activity-flows.mdx | 2 - .../order-configurations/order-types.mdx | 2 - .../order-configurations/overview.mdx | 2 - .../operations/orders/importing-orders.mdx | 2 - .../operations/orders/kanban-board.mdx | 2 - .../operations/orders/managing-orders.mdx | 2 - .../operations/orders/order-lifecycle.mdx | 2 - .../fleet-ops/operations/orders/overview.mdx | 2 - .../operations/orders/proof-of-delivery.mdx | 2 - .../operations/orders/scheduling-orders.mdx | 2 - .../fleet-ops/operations/orders/tracking.mdx | 2 - .../docs/fleet-ops/operations/overview.mdx | 2 - .../scheduler/driver-shift-schedules.mdx | 2 - .../operations/scheduler/order-scheduling.mdx | 2 - .../operations/scheduler/overview.mdx | 2 - .../service-areas-geofences/geofences.mdx | 4 +- .../service-areas-geofences/service-areas.mdx | 2 - .../service-areas-geofences/zones.mdx | 2 - .../operations/service-quotes/overview.mdx | 2 - .../service-rates/algorithm-rates.mdx | 2 - .../operations/service-rates/fixed-rate.mdx | 2 - .../service-rates/multi-zone-distance.mdx | 2 - .../operations/service-rates/overview.mdx | 2 - .../operations/service-rates/parcel.mdx | 2 - .../operations/service-rates/per-drop.mdx | 2 - .../operations/service-rates/per-meter.mdx | 2 - .../recipes/fuel-provider-integrations.mdx | 2 - .../fleet-ops/resources/contacts/overview.mdx | 2 - .../resources/drivers/navigator-access.mdx | 2 - .../fleet-ops/resources/drivers/overview.mdx | 2 - .../resources/drivers/shift-schedules.mdx | 2 - .../fleet-ops/resources/fleets/overview.mdx | 2 - .../resources/fuel-reports/overview.mdx | 2 - .../fleet-ops/resources/issues/overview.mdx | 2 - content/docs/fleet-ops/resources/overview.mdx | 2 - .../fleet-ops/resources/places/overview.mdx | 2 - .../vehicles/capacity-and-payload.mdx | 2 - .../fleet-ops/resources/vehicles/overview.mdx | 2 - .../fleet-ops/resources/vehicles/tracking.mdx | 2 - .../resources/vendors/integrated-vendors.mdx | 2 - .../fleet-ops/resources/vendors/overview.mdx | 2 - content/docs/fleet-ops/settings/avatars.mdx | 2 - .../docs/fleet-ops/settings/custom-fields.mdx | 2 - content/docs/fleet-ops/settings/map.mdx | 2 - .../docs/fleet-ops/settings/navigator-app.mdx | 2 - .../docs/fleet-ops/settings/notifications.mdx | 2 - .../docs/fleet-ops/settings/orchestrator.mdx | 2 - content/docs/fleet-ops/settings/payments.mdx | 2 - content/docs/fleet-ops/settings/routing.mdx | 2 - .../docs/fleet-ops/settings/scheduling.mdx | 2 - .../ledger/accounting/chart-of-accounts.mdx | 2 - .../docs/ledger/accounting/general-ledger.mdx | 2 - .../ledger/accounting/journal-entries.mdx | 2 - content/docs/ledger/accounting/overview.mdx | 2 - .../docs/ledger/billing/invoice-templates.mdx | 2 - content/docs/ledger/billing/invoices.mdx | 2 - content/docs/ledger/billing/overview.mdx | 2 - .../ledger/getting-started/core-concepts.mdx | 2 - .../ledger/getting-started/quickstart.mdx | 2 - .../docs/ledger/integrations/fleet-ops.mdx | 2 - .../docs/ledger/integrations/storefront.mdx | 2 - .../docs/ledger/payments/gateways/cash.mdx | 2 - .../ledger/payments/gateways/gnu-taler.mdx | 2 - .../ledger/payments/gateways/overview.mdx | 2 - .../docs/ledger/payments/gateways/qpay.mdx | 2 - .../docs/ledger/payments/gateways/stripe.mdx | 2 - content/docs/ledger/payments/overview.mdx | 2 - content/docs/ledger/payments/transactions.mdx | 2 - content/docs/ledger/payments/wallets.mdx | 2 - .../ledger/recipes/payment-gateway-driver.mdx | 2 - content/docs/ledger/reports/ar-aging.mdx | 2 - content/docs/ledger/reports/balance-sheet.mdx | 2 - content/docs/ledger/reports/cash-flow.mdx | 2 - .../docs/ledger/reports/income-statement.mdx | 2 - content/docs/ledger/reports/overview.mdx | 2 - content/docs/ledger/reports/trial-balance.mdx | 2 - .../docs/ledger/reports/wallet-summary.mdx | 2 - content/docs/ledger/settings/overview.mdx | 2 - content/docs/pallet/audits/cycle-counts.mdx | 2 - content/docs/pallet/audits/overview.mdx | 6 +- content/docs/pallet/fulfillment/overview.mdx | 10 +- .../docs/pallet/fulfillment/pick-lists.mdx | 2 - .../pallet/fulfillment/purchase-orders.mdx | 2 - .../docs/pallet/fulfillment/sales-orders.mdx | 2 - .../pallet/fulfillment/waves-and-batches.mdx | 2 - .../pallet/getting-started/core-concepts.mdx | 1 + .../pallet/getting-started/quickstart.mdx | 1 + content/docs/pallet/index.mdx | 12 +- .../docs/pallet/inventory/expired-stock.mdx | 2 - content/docs/pallet/inventory/low-stock.mdx | 2 - content/docs/pallet/inventory/overview.mdx | 6 +- content/docs/pallet/inventory/products.mdx | 2 - .../pallet/inventory/stock-adjustments.mdx | 2 - .../docs/pallet/inventory/stock-levels.mdx | 2 - .../docs/pallet/inventory/stock-transfers.mdx | 2 - content/docs/pallet/reports/overview.mdx | 2 - content/docs/pallet/suppliers/overview.mdx | 2 - content/docs/pallet/warehouses/overview.mdx | 2 - content/docs/pallet/warehouses/warehouses.mdx | 2 - .../warehouses/zones-aisles-racks-bins.mdx | 2 - .../docs/platform/console-features/chat.mdx | 2 - .../console-features/custom-fields.mdx | 2 - .../dashboards-and-widgets.mdx | 2 - .../console-features/internationalization.mdx | 2 - .../platform/console-features/navigation.mdx | 2 - .../console-features/notifications.mdx | 2 - .../platform/developer-console/api-keys.mdx | 2 - .../docs/platform/developer-console/index.mdx | 2 - .../developer-console/request-logs.mdx | 2 - .../developer-console/socket-events.mdx | 2 - .../developer-console/system-events.mdx | 2 - .../platform/developer-console/webhooks.mdx | 2 - .../extensions/browsing-and-installing.mdx | 2 - content/docs/platform/extensions/index.mdx | 2 - .../extensions/managing-extensions.mdx | 2 - .../platform/getting-started/architecture.mdx | 2 - .../platform/getting-started/overview.mdx | 2 - .../getting-started/why-fleetbase.mdx | 2 - .../platform/identity-and-access/groups.mdx | 2 - .../identity-and-access/organizations.mdx | 2 - .../platform/identity-and-access/policies.mdx | 2 - .../roles-and-permissions.mdx | 2 - .../two-factor-authentication.mdx | 2 - .../identity-and-access/user-management.mdx | 2 - .../platform/identity-and-access/users.mdx | 2 - content/docs/platform/index.mdx | 2 - .../platform/quickstart/cloud-quickstart.mdx | 12 +- .../platform/quickstart/deploy-in-cloud.mdx | 2 - .../platform/quickstart/development-setup.mdx | 2 - .../quickstart/infrastructure-sizing.mdx | 2 - .../platform/quickstart/running-locally.mdx | 2 - .../recipes/build-a-custom-integration.mdx | 2 - .../recipes/configure-custom-fields.mdx | 2 - .../recipes/connect-your-first-webhook.mdx | 2 - .../recipes/set-up-real-time-tracking.mdx | 2 - .../docs/platform/system-setup/branding.mdx | 2 - .../docs/platform/system-setup/filesystem.mdx | 2 - content/docs/platform/system-setup/mail.mdx | 2 - .../system-setup/push-notifications.mdx | 2 - content/docs/platform/system-setup/queue.mdx | 2 - .../docs/platform/system-setup/services.mdx | 2 - content/docs/platform/system-setup/socket.mdx | 2 - .../two-factor-authentication.mdx | 2 - .../docs/storefront/app/build-and-release.mdx | 2 - content/docs/storefront/app/configuration.mdx | 2 - content/docs/storefront/app/integrations.mdx | 2 - content/docs/storefront/app/overview.mdx | 2 - content/docs/storefront/app/quickstart.mdx | 2 - content/docs/storefront/app/theming.mdx | 2 - .../docs/storefront/catalog/categories.mdx | 2 - content/docs/storefront/catalog/overview.mdx | 2 - content/docs/storefront/catalog/pricing.mdx | 2 - content/docs/storefront/catalog/products.mdx | 2 - .../catalog/variants-and-addons.mdx | 2 - .../storefront/customers/authentication.mdx | 2 - .../docs/storefront/customers/overview.mdx | 2 - .../getting-started/core-concepts.mdx | 2 - .../storefront/getting-started/quickstart.mdx | 2 - content/docs/storefront/networks/overview.mdx | 2 - content/docs/storefront/orders/cart.mdx | 2 - content/docs/storefront/orders/checkout.mdx | 2 - content/docs/storefront/orders/overview.mdx | 2 - .../storefront/orders/payment-gateways.mdx | 2 - .../docs/storefront/orders/service-quotes.mdx | 2 - .../promotions/push-notifications.mdx | 2 - content/docs/storefront/settings/api.mdx | 2 - content/docs/storefront/settings/gateways.mdx | 2 - .../docs/storefront/settings/locations.mdx | 2 - .../storefront/settings/notifications.mdx | 2 - .../docs/storefront/stores/food-trucks.mdx | 2 - .../storefront/stores/operating-hours.mdx | 2 - content/docs/storefront/stores/overview.mdx | 2 - content/docs/storefront/stores/setup.mdx | 2 - .../storefront/stores/store-locations.mdx | 2 - content/docs/ui/actions/button.mdx | 2 - content/docs/ui/actions/click-to-copy.mdx | 2 - content/docs/ui/actions/click-to-reveal.mdx | 2 - content/docs/ui/builders/report-builder.mdx | 2 - content/docs/ui/builders/template-builder.mdx | 2 - content/docs/ui/dashboard/overview.mdx | 4 +- content/docs/ui/dashboard/service.mdx | 2 - content/docs/ui/display/activity-log.mdx | 2 - content/docs/ui/display/badge.mdx | 2 - content/docs/ui/display/comment-thread.mdx | 2 - content/docs/ui/display/file.mdx | 2 - content/docs/ui/display/pill.mdx | 2 - content/docs/ui/display/progress-bar.mdx | 2 - content/docs/ui/display/spinner.mdx | 2 - content/docs/ui/display/table.mdx | 2 - content/docs/ui/display/timeline.mdx | 2 - .../docs/ui/getting-started/core-concepts.mdx | 2 - .../docs/ui/getting-started/installation.mdx | 2 - content/docs/ui/helpers/data.mdx | 2 - content/docs/ui/helpers/formatting.mdx | 2 - content/docs/ui/helpers/modifiers.mdx | 2 - content/docs/ui/helpers/permissions.mdx | 2 - content/docs/ui/helpers/type-checking.mdx | 2 - content/docs/ui/inputs/checkbox.mdx | 2 - content/docs/ui/inputs/combo-box.mdx | 2 - content/docs/ui/inputs/coordinates-input.mdx | 2 - content/docs/ui/inputs/date-picker.mdx | 2 - content/docs/ui/inputs/date-time-input.mdx | 2 - content/docs/ui/inputs/file-upload.mdx | 2 - content/docs/ui/inputs/input-group.mdx | 2 - .../ui/inputs/model-coordinates-input.mdx | 2 - content/docs/ui/inputs/model-select.mdx | 2 - content/docs/ui/inputs/money-input.mdx | 2 - content/docs/ui/inputs/multi-select.mdx | 2 - content/docs/ui/inputs/phone-input.mdx | 2 - content/docs/ui/inputs/select.mdx | 2 - content/docs/ui/inputs/toggle.mdx | 2 - content/docs/ui/inputs/unit-input.mdx | 2 - content/docs/ui/layout/attach-popover.mdx | 2 - content/docs/ui/layout/attach-tooltip.mdx | 2 - content/docs/ui/layout/content-panel.mdx | 2 - content/docs/ui/layout/drawer.mdx | 2 - content/docs/ui/layout/floating.mdx | 2 - content/docs/ui/layout/overlay.mdx | 2 - content/docs/ui/layout/overview.mdx | 2 - content/docs/ui/layout/resource-tabular.mdx | 2 - content/docs/ui/layout/spacer.mdx | 2 - content/docs/ui/modals/modal-layouts.mdx | 2 - content/docs/ui/modals/modals-manager.mdx | 2 - content/docs/ui/modals/overview.mdx | 2 - .../docs/ui/navigation/dropdown-button.mdx | 2 - content/docs/ui/navigation/tab-navigation.mdx | 2 - content/docs/ui/navigation/tabs.mdx | 2 - content/docs/ui/registry/overview.mdx | 4 +- content/docs/ui/registry/registry-yield.mdx | 2 - content/docs/ui/scheduling/event-calendar.mdx | 2 - content/docs/ui/scheduling/full-calendar.mdx | 2 - content/docs/ui/scheduling/kanban.mdx | 2 - content/docs/ui/services/overview.mdx | 2 - .../ui/services/resource-context-panel.mdx | 2 - content/docs/ui/services/sidebar.mdx | 2 - content/docs/ui/services/template-builder.mdx | 2 - next.config.ts | 26 +++ public/images/integrations/android.svg | 1 + public/images/integrations/digitalocean.svg | 1 + public/images/integrations/docker.svg | 1 + public/images/integrations/expo.svg | 1 + public/images/integrations/googlemaps.svg | 1 + public/images/integrations/kubernetes.svg | 1 + public/images/integrations/laravel.svg | 1 + public/images/integrations/mailgun.svg | 1 + public/images/integrations/mysql.svg | 1 + public/images/integrations/nextdotjs.svg | 1 + public/images/integrations/nodedotjs.svg | 1 + public/images/integrations/openstreetmap.svg | 1 + public/images/integrations/php.svg | 1 + public/images/integrations/react.svg | 1 + public/images/integrations/redis.svg | 1 + public/images/integrations/sentry.svg | 1 + public/images/integrations/shopify.svg | 1 + public/images/integrations/woocommerce.svg | 1 + src/app/blog/page.tsx | 2 +- src/app/compare/page.tsx | 12 +- src/app/developers/webhooks/page.tsx | 2 +- src/app/oli-max/page.tsx | 2 +- src/app/page.tsx | 2 + src/app/platform/ai/page.tsx | 2 + src/app/platform/developer-console/page.tsx | 2 + .../extensions/extensions-page-content.tsx | 57 +++--- src/app/platform/extensions/page.tsx | 2 + src/app/platform/fleetops/page.tsx | 11 +- src/app/platform/ledger/page.tsx | 2 + src/app/platform/mobile/page.tsx | 2 + src/app/platform/navigator/page.tsx | 2 + src/app/platform/pallet/page.tsx | 2 + src/app/platform/security/page.tsx | 2 + .../security/security-page-content.tsx | 2 +- src/app/platform/storefront/page.tsx | 2 + src/app/product/page.tsx | 2 +- src/app/true-vegan/page.tsx | 2 +- src/components/layout/footer.tsx | 22 ++- src/components/sections/switching-callout.tsx | 129 ++++++++++++ src/components/seo/related-pages.tsx | 57 ++++++ .../solutions/solution-page-layout.tsx | 4 + src/lib/ghost.ts | 8 +- src/lib/related-pages.ts | 186 ++++++++++++++++++ 390 files changed, 542 insertions(+), 756 deletions(-) create mode 100644 public/images/integrations/android.svg create mode 100644 public/images/integrations/digitalocean.svg create mode 100644 public/images/integrations/docker.svg create mode 100644 public/images/integrations/expo.svg create mode 100644 public/images/integrations/googlemaps.svg create mode 100644 public/images/integrations/kubernetes.svg create mode 100644 public/images/integrations/laravel.svg create mode 100644 public/images/integrations/mailgun.svg create mode 100644 public/images/integrations/mysql.svg create mode 100644 public/images/integrations/nextdotjs.svg create mode 100644 public/images/integrations/nodedotjs.svg create mode 100644 public/images/integrations/openstreetmap.svg create mode 100644 public/images/integrations/php.svg create mode 100644 public/images/integrations/react.svg create mode 100644 public/images/integrations/redis.svg create mode 100644 public/images/integrations/sentry.svg create mode 100644 public/images/integrations/shopify.svg create mode 100644 public/images/integrations/woocommerce.svg create mode 100644 src/components/sections/switching-callout.tsx create mode 100644 src/components/seo/related-pages.tsx create mode 100644 src/lib/related-pages.ts diff --git a/content/docs/apps/index.mdx b/content/docs/apps/index.mdx index e2f7234f..1ae0b7c3 100644 --- a/content/docs/apps/index.mdx +++ b/content/docs/apps/index.mdx @@ -3,8 +3,6 @@ title: Mobile Apps description: Open-source mobile apps built on Fleetbase — the Navigator App for drivers and the Storefront App for customers. --- -# Mobile Apps - Fleetbase provides two fully functional, open-source mobile applications built with React Native (Expo). These apps are designed to work seamlessly with the Fleetbase API and can be customized, white-labeled, and deployed to the App Store and Google Play Store under your own brand. ## The Navigator App diff --git a/content/docs/apps/navigator-app/customization.mdx b/content/docs/apps/navigator-app/customization.mdx index e1c1c973..41586f89 100644 --- a/content/docs/apps/navigator-app/customization.mdx +++ b/content/docs/apps/navigator-app/customization.mdx @@ -3,8 +3,6 @@ title: Customization & White-Labeling description: Customize the Navigator App with your branding, colors, and features before publishing to app stores. --- -# Customization & White-Labeling - Once you have the Navigator App running locally, you can customize it to match your company's branding before deploying it to the App Store or Google Play Store. ## App Configuration (`app.json`) diff --git a/content/docs/apps/navigator-app/index.mdx b/content/docs/apps/navigator-app/index.mdx index fbe6f6f8..e9b603ad 100644 --- a/content/docs/apps/navigator-app/index.mdx +++ b/content/docs/apps/navigator-app/index.mdx @@ -3,8 +3,6 @@ title: Navigator App description: The Navigator App is an open-source driver app for managing orders, tracking location, and communicating with dispatch. --- -# Navigator App - The Navigator App is an open-source driver app for managing orders, tracking location, and communicating with dispatch. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/apps/navigator-app/overview.mdx b/content/docs/apps/navigator-app/overview.mdx index 21593957..d8c2b41d 100644 --- a/content/docs/apps/navigator-app/overview.mdx +++ b/content/docs/apps/navigator-app/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: An overview of the Navigator App — features, supported platforms, and how it integrates with Fleet-Ops. --- -# Navigator App Overview - The **Navigator App** is an open-source, React Native (Expo) mobile application designed for drivers and delivery personnel. It integrates directly with the [Fleet-Ops](/docs/fleetops/overview) extension to provide a complete end-to-end delivery management solution. ## Key Features diff --git a/content/docs/apps/navigator-app/setup.mdx b/content/docs/apps/navigator-app/setup.mdx index 341b813d..d9a6a988 100644 --- a/content/docs/apps/navigator-app/setup.mdx +++ b/content/docs/apps/navigator-app/setup.mdx @@ -3,8 +3,6 @@ title: Setup & Configuration description: Set up the Navigator App, configure it to connect to your Fleetbase instance, and prepare it for deployment. --- -# Setup & Configuration - This guide explains how to set up the Navigator App locally, configure it to connect to your Fleetbase instance, and prepare it for deployment. ## Prerequisites diff --git a/content/docs/apps/storefront-app/customization.mdx b/content/docs/apps/storefront-app/customization.mdx index 37790256..49fac705 100644 --- a/content/docs/apps/storefront-app/customization.mdx +++ b/content/docs/apps/storefront-app/customization.mdx @@ -3,8 +3,6 @@ title: Customization & White-Labeling description: Customize the Storefront App with your branding and product catalog before publishing to app stores. --- -# Customization & White-Labeling - Once you have the Storefront App running locally, you can customize it to match your company's branding before deploying it to the App Store or Google Play Store. ## App Configuration (`app.json`) diff --git a/content/docs/apps/storefront-app/index.mdx b/content/docs/apps/storefront-app/index.mdx index 45534179..9ae4cef5 100644 --- a/content/docs/apps/storefront-app/index.mdx +++ b/content/docs/apps/storefront-app/index.mdx @@ -3,8 +3,6 @@ title: Storefront App description: The Storefront App is an open-source customer-facing mobile app for your Storefront-powered marketplace. --- -# Storefront App - The Storefront App is an open-source customer-facing mobile app for your Storefront-powered marketplace. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/apps/storefront-app/overview.mdx b/content/docs/apps/storefront-app/overview.mdx index e393efd2..26f50e7b 100644 --- a/content/docs/apps/storefront-app/overview.mdx +++ b/content/docs/apps/storefront-app/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: An overview of the Storefront App — features, supported platforms, and how it integrates with the Storefront extension. --- -# Storefront App Overview - The **Storefront App** is an open-source, React Native (Expo) mobile application designed for customers. It integrates directly with the [Storefront](/docs/storefront/overview) extension to provide a complete, white-label e-commerce and on-demand delivery experience. ## Key Features diff --git a/content/docs/apps/storefront-app/setup.mdx b/content/docs/apps/storefront-app/setup.mdx index 0b5599b1..fd6dae6b 100644 --- a/content/docs/apps/storefront-app/setup.mdx +++ b/content/docs/apps/storefront-app/setup.mdx @@ -3,8 +3,6 @@ title: Setup & Configuration description: Set up the Storefront App and connect it to your Fleetbase Storefront instance. --- -# Setup & Configuration - This guide explains how to set up the Storefront App locally, configure it to connect to your Fleetbase instance, and prepare it for deployment. ## Prerequisites diff --git a/content/docs/cli/account/generate-token.mdx b/content/docs/cli/account/generate-token.mdx index ba152b52..dae78ace 100644 --- a/content/docs/cli/account/generate-token.mdx +++ b/content/docs/cli/account/generate-token.mdx @@ -3,8 +3,6 @@ title: Generate Token description: "Generate or regenerate a long-lived registry authentication token using `flb generate-token` — ideal for CI/CD pipelines." --- -# `flb generate-token` - Generate (or regenerate) a long-lived **registry authentication token** for your developer account. Tokens are great for CI/CD pipelines where you don't want to store a username and password. ```bash diff --git a/content/docs/cli/account/login.mdx b/content/docs/cli/account/login.mdx index 079b5791..a3f8f015 100644 --- a/content/docs/cli/account/login.mdx +++ b/content/docs/cli/account/login.mdx @@ -3,8 +3,6 @@ title: Login description: "Authenticate with the Fleetbase registry using `flb login` — under the hood this writes credentials into your `.npmrc`." --- -# `flb login` - Log in to the Fleetbase Extension Registry using your username, password, and email. Under the hood the CLI delegates to `npm-cli-login`, which writes a registry auth entry into your `~/.npmrc`. ```bash diff --git a/content/docs/cli/account/register.mdx b/content/docs/cli/account/register.mdx index 628ee676..0d0657ef 100644 --- a/content/docs/cli/account/register.mdx +++ b/content/docs/cli/account/register.mdx @@ -3,8 +3,6 @@ title: Register description: "Create a Fleetbase Extension Registry developer account using `flb register` so you can publish your own extensions." --- -# `flb register` - Create a developer account on the Fleetbase Extension Registry. You need an account to publish extensions — managing or installing extensions does **not** require an account. ```bash diff --git a/content/docs/cli/account/resend-verification.mdx b/content/docs/cli/account/resend-verification.mdx index 7ff2b282..928e82ff 100644 --- a/content/docs/cli/account/resend-verification.mdx +++ b/content/docs/cli/account/resend-verification.mdx @@ -3,8 +3,6 @@ title: Resend Verification description: "Request a fresh verification code from the registry using `flb resend-verification`." --- -# `flb resend-verification` - Request that the registry email a fresh verification code. Use this when the original email from `flb register` never arrived, or when the code has expired. ```bash diff --git a/content/docs/cli/account/set-auth.mdx b/content/docs/cli/account/set-auth.mdx index 7e62752c..34d16abb 100644 --- a/content/docs/cli/account/set-auth.mdx +++ b/content/docs/cli/account/set-auth.mdx @@ -3,8 +3,6 @@ title: Set Auth description: "Write a registry auth token into your Fleetbase instance's `.npmrc` and Composer `auth.json` using `flb set-auth`." --- -# `flb set-auth` - Write a registry auth token into your Fleetbase instance's `console/.npmrc` (for npm) and `api/auth.json` (for Composer). Run this after [`flb verify`](/docs/cli/account/verify) or [`flb generate-token`](/docs/cli/account/generate-token) returns a token. ```bash diff --git a/content/docs/cli/account/verify.mdx b/content/docs/cli/account/verify.mdx index bc0f7697..1f77f27d 100644 --- a/content/docs/cli/account/verify.mdx +++ b/content/docs/cli/account/verify.mdx @@ -3,8 +3,6 @@ title: Verify description: "Verify your registry account email using `flb verify` and receive your registry auth token." --- -# `flb verify` - Verify the email on a registry account you just registered. On success, the registry returns your **registry auth token** — save it; you'll use it to publish extensions. ```bash diff --git a/content/docs/cli/extension-development/bundle-upload.mdx b/content/docs/cli/extension-development/bundle-upload.mdx index 456e57ad..75d6a0a6 100644 --- a/content/docs/cli/extension-development/bundle-upload.mdx +++ b/content/docs/cli/extension-development/bundle-upload.mdx @@ -3,8 +3,6 @@ title: Bundle Upload description: "Upload an existing extension bundle to the Fleetbase registry using `flb bundle-upload`." --- -# `flb bundle-upload` - Upload a `.tar.gz` bundle (created by [`flb bundle`](/docs/cli/extension-development/bundle)) to the Fleetbase Extension Registry. Use this when you've already bundled (e.g. as a separate CI step) and just need to ship the archive. ```bash diff --git a/content/docs/cli/extension-development/bundle.mdx b/content/docs/cli/extension-development/bundle.mdx index 73b9badc..63662862 100644 --- a/content/docs/cli/extension-development/bundle.mdx +++ b/content/docs/cli/extension-development/bundle.mdx @@ -3,8 +3,6 @@ title: Bundle description: "Pack an extension into a versioned `.tar.gz` for distribution using `flb bundle`." --- -# `flb bundle` - Package your extension into a `.tar.gz` archive for distribution. The output is named `<package-name>-v<version>-bundle.tar.gz` and excludes `node_modules/`, `server_vendor/`, and any previously generated bundle files. ```bash diff --git a/content/docs/cli/extension-development/overview.mdx b/content/docs/cli/extension-development/overview.mdx index 2fa67696..b12dac74 100644 --- a/content/docs/cli/extension-development/overview.mdx +++ b/content/docs/cli/extension-development/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: Build, test, version, bundle, and publish custom Fleetbase extensions using the CLI. --- -# Publishing Extensions - The CLI gives you the full lifecycle for authoring and shipping a Fleetbase extension — from scaffolding a new project to publishing it on the Extension Registry. ## The Lifecycle diff --git a/content/docs/cli/extension-development/publish.mdx b/content/docs/cli/extension-development/publish.mdx index 2e97082c..3d37eb22 100644 --- a/content/docs/cli/extension-development/publish.mdx +++ b/content/docs/cli/extension-development/publish.mdx @@ -3,8 +3,6 @@ title: Publish description: "Publish your extension to the Fleetbase Extension Registry using `flb publish` — runs `npm publish` against the configured registry." --- -# `flb publish` - Publish your extension to the Fleetbase Extension Registry. Under the hood this runs `npm publish` against the registry. Both an npm package (`package.json`) and a Composer package (`composer.json`) are typically published — but `flb publish` handles them via the same npm publish mechanism (the CLI auto-converts `composer.json` into a temporary `package.json` for the API side). ```bash diff --git a/content/docs/cli/extension-development/scaffold.mdx b/content/docs/cli/extension-development/scaffold.mdx index f815fd2e..b7bdad29 100644 --- a/content/docs/cli/extension-development/scaffold.mdx +++ b/content/docs/cli/extension-development/scaffold.mdx @@ -3,8 +3,6 @@ title: Scaffold description: "Generate a new Fleetbase extension from the starter template using `flb scaffold`." --- -# `flb scaffold` - Generate a new Fleetbase extension from the [`fleetbase/starter-extension`](https://github.com/fleetbase/starter-extension) template. The CLI clones the template, prompts for your extension's name and metadata, then refactors namespaces, package names, and class names so it's ready to develop against immediately. ```bash diff --git a/content/docs/cli/extension-development/unpublish.mdx b/content/docs/cli/extension-development/unpublish.mdx index 0cd5f4b5..42b89a80 100644 --- a/content/docs/cli/extension-development/unpublish.mdx +++ b/content/docs/cli/extension-development/unpublish.mdx @@ -3,8 +3,6 @@ title: Unpublish description: "Remove a published extension from the Fleetbase Extension Registry using `flb unpublish`." --- -# `flb unpublish` - Remove a published extension (or a specific version of it) from the registry. Under the hood this runs `npm unpublish --force`. ```bash diff --git a/content/docs/cli/extension-development/version-bump.mdx b/content/docs/cli/extension-development/version-bump.mdx index a1fe541f..2342cd23 100644 --- a/content/docs/cli/extension-development/version-bump.mdx +++ b/content/docs/cli/extension-development/version-bump.mdx @@ -3,8 +3,6 @@ title: Version Bump description: "Increment the version of your extension across all manifest files using `flb version-bump`." --- -# `flb version-bump` - Bump your extension's version across **all three manifest files** in one step: - `extension.json` diff --git a/content/docs/cli/extensions/install.mdx b/content/docs/cli/extensions/install.mdx index 45843842..6674c652 100644 --- a/content/docs/cli/extensions/install.mdx +++ b/content/docs/cli/extensions/install.mdx @@ -3,8 +3,6 @@ title: Install description: "Install an extension into a running Fleetbase instance using `flb install`." --- -# `flb install` - Install a Fleetbase extension into a running self-hosted Fleetbase instance. The CLI looks up the npm and Composer package names for the extension and runs both `pnpm install` (in `console/`) and `composer require` (in `api/`). ```bash diff --git a/content/docs/cli/extensions/search.mdx b/content/docs/cli/extensions/search.mdx index c4da9a32..66041fa6 100644 --- a/content/docs/cli/extensions/search.mdx +++ b/content/docs/cli/extensions/search.mdx @@ -3,8 +3,6 @@ title: Search description: "Browse the Fleetbase Extension Registry from the command line with `flb search`." --- -# `flb search` - Browse and filter the Fleetbase Extension Registry from your terminal. Use this to discover available extensions before installing one. ```bash diff --git a/content/docs/cli/extensions/uninstall.mdx b/content/docs/cli/extensions/uninstall.mdx index a86e465f..04b14b67 100644 --- a/content/docs/cli/extensions/uninstall.mdx +++ b/content/docs/cli/extensions/uninstall.mdx @@ -3,8 +3,6 @@ title: Uninstall description: "Remove an installed extension from a running Fleetbase instance using `flb uninstall`." --- -# `flb uninstall` - Remove a previously installed extension from a Fleetbase instance. The CLI runs `pnpm remove` (in `console/`) and `composer remove` (in `api/`). ```bash diff --git a/content/docs/cli/getting-started/commands.mdx b/content/docs/cli/getting-started/commands.mdx index ad4ecabc..3f33eca0 100644 --- a/content/docs/cli/getting-started/commands.mdx +++ b/content/docs/cli/getting-started/commands.mdx @@ -3,8 +3,6 @@ title: Commands description: Reference table of every Fleetbase CLI command with a one-line description and a link to its page. --- -# Commands - Quick reference for every command the `flb` CLI exposes. Click any command for the full options, examples, and behavior. ## Install Fleetbase diff --git a/content/docs/cli/getting-started/installation.mdx b/content/docs/cli/getting-started/installation.mdx index 739b18ee..9c5d7dbb 100644 --- a/content/docs/cli/getting-started/installation.mdx +++ b/content/docs/cli/getting-started/installation.mdx @@ -3,8 +3,6 @@ title: Installing the CLI description: Install the Fleetbase CLI globally via npm so the `flb` command is available system-wide. --- -# Installing the CLI - The Fleetbase CLI is distributed on npm as `@fleetbase/cli`. Install it globally so the `flb` command is on your PATH. ## With npm diff --git a/content/docs/cli/getting-started/requirements.mdx b/content/docs/cli/getting-started/requirements.mdx index 93cf3be3..794d2419 100644 --- a/content/docs/cli/getting-started/requirements.mdx +++ b/content/docs/cli/getting-started/requirements.mdx @@ -3,8 +3,6 @@ title: Requirements description: What you need installed before using the Fleetbase CLI — Node, plus Docker and Git for installing Fleetbase itself. --- -# Requirements - The CLI itself runs on Node. Some commands additionally need Docker, Git, pnpm, or PHP/Composer on your machine. ## CLI Itself diff --git a/content/docs/cli/installation/overview.mdx b/content/docs/cli/installation/overview.mdx index 501a5e36..6690a3dc 100644 --- a/content/docs/cli/installation/overview.mdx +++ b/content/docs/cli/installation/overview.mdx @@ -3,8 +3,6 @@ title: Install Fleetbase description: "Install a self-hosted Fleetbase instance on your own infrastructure using `flb install-fleetbase` — an interactive Docker-based wizard." --- -# Install Fleetbase - ```bash flb install-fleetbase ``` diff --git a/content/docs/community/changelog.mdx b/content/docs/community/changelog.mdx index 5ebc4af8..7cfff307 100644 --- a/content/docs/community/changelog.mdx +++ b/content/docs/community/changelog.mdx @@ -3,8 +3,6 @@ title: Changelog description: Release notes and version history across the Fleetbase platform — core API, Console, extensions, and mobile apps. --- -# Changelog - Fleetbase is a modular platform composed of several independent repositories, each with its own release cycle. Release notes are maintained on GitHub Releases for each repository. ## Platform Releases diff --git a/content/docs/community/discord.mdx b/content/docs/community/discord.mdx index dad73fa4..fe6963ed 100644 --- a/content/docs/community/discord.mdx +++ b/content/docs/community/discord.mdx @@ -3,8 +3,6 @@ title: Discord Community description: Join the Fleetbase Discord server to get help, share what you've built, and connect with the core team and other operators. --- -# Discord Community - The Fleetbase Discord server is the fastest way to get help, share what you're building, and connect with the core team and other operators running Fleetbase in production. **[Join the Fleetbase Discord →](https://discord.com/invite/V7RVWRQ2Wm)** diff --git a/content/docs/community/faq.mdx b/content/docs/community/faq.mdx index cd9da1f3..5b7522a7 100644 --- a/content/docs/community/faq.mdx +++ b/content/docs/community/faq.mdx @@ -3,8 +3,6 @@ title: FAQ description: Answers to frequently asked questions about Fleetbase — what it is, how it's licensed, how to deploy it, and how it works. --- -# Frequently Asked Questions - <Accordions> <Accordion title="What is Fleetbase?"> Fleetbase is an open-source, modular logistics and supply chain operating system. It provides a platform for managing fleets, orders, drivers, warehouses, and supply chain operations — either self-hosted on your own infrastructure or via Fleetbase Cloud. diff --git a/content/docs/community/github-discussions.mdx b/content/docs/community/github-discussions.mdx index 7223d1d4..e9d8f4af 100644 --- a/content/docs/community/github-discussions.mdx +++ b/content/docs/community/github-discussions.mdx @@ -3,8 +3,6 @@ title: GitHub Discussions description: Ask questions, propose features, and participate in longer-form community conversations about Fleetbase on GitHub Discussions. --- -# GitHub Discussions - [GitHub Discussions](https://github.com/fleetbase/fleetbase/discussions) is the home for longer-form community conversations about Fleetbase — feature proposals, architecture questions, integration ideas, and anything that benefits from a permanent, searchable record rather than a real-time chat message. **[Open a Discussion →](https://github.com/fleetbase/fleetbase/discussions/new/choose)** diff --git a/content/docs/community/index.mdx b/content/docs/community/index.mdx index 0d0591cb..7a92b87a 100644 --- a/content/docs/community/index.mdx +++ b/content/docs/community/index.mdx @@ -3,8 +3,6 @@ title: Community & Support description: Get help, contribute to Fleetbase, and find the right support option for your team. --- -# Community & Support - Fleetbase is open-source and community-driven. Whether you need help getting started, want to report a bug, contribute code, or talk through a deployment with the core team — this is where to start. ## Real-Time Help diff --git a/content/docs/community/licensing.mdx b/content/docs/community/licensing.mdx index 8528ce2c..cd6b24cc 100644 --- a/content/docs/community/licensing.mdx +++ b/content/docs/community/licensing.mdx @@ -3,8 +3,6 @@ title: Licensing description: Understand the Fleetbase licensing model — AGPL-3.0 for open-source use and commercial license options for proprietary products. --- -# Licensing - Fleetbase uses a **dual-licensing model**: an open-source license for the community and a commercial license for proprietary use cases. <Callout type="info"> diff --git a/content/docs/community/support-plans.mdx b/content/docs/community/support-plans.mdx index cb64862f..020a8238 100644 --- a/content/docs/community/support-plans.mdx +++ b/content/docs/community/support-plans.mdx @@ -3,8 +3,6 @@ title: Support Plans description: Community, cloud, and enterprise support options for Fleetbase — from free community channels to dedicated SLAs. --- -# Support Plans - Fleetbase offers several support options depending on whether you're self-hosting, on Fleetbase Cloud, or need enterprise-grade guarantees. ## Community Support — Free diff --git a/content/docs/contributing/code.mdx b/content/docs/contributing/code.mdx index 81e5bbb5..db8bbb25 100644 --- a/content/docs/contributing/code.mdx +++ b/content/docs/contributing/code.mdx @@ -4,8 +4,6 @@ description: How to submit bug fixes, features, and refactors to Fleetbase — b sidebarTitle: Code --- -# Code contributions - This page covers contributing **code** to Fleetbase — bug fixes, features, refactors, and improvements across the core platform and its extensions. For other contribution types see [Translations](/docs/contributing/translations), [Documentation](/docs/contributing/documentation), [Extensions](/docs/contributing/extensions), or [Reporting issues](/docs/contributing/reporting-issues). diff --git a/content/docs/contributing/documentation.mdx b/content/docs/contributing/documentation.mdx index 16bb851b..32d074b4 100644 --- a/content/docs/contributing/documentation.mdx +++ b/content/docs/contributing/documentation.mdx @@ -4,8 +4,6 @@ description: How to contribute to Fleetbase documentation — fixing typos, addi sidebarTitle: Documentation --- -# Documentation contributions - The documentation you're reading right now lives in the [`fleetbase/fleetbase.io`](https://github.com/fleetbase/fleetbase.io) repository. Every page is editable. If something is wrong, unclear, or missing — submit a PR. ## Where the docs live diff --git a/content/docs/contributing/extensions.mdx b/content/docs/contributing/extensions.mdx index d14769ce..d6ef5ce0 100644 --- a/content/docs/contributing/extensions.mdx +++ b/content/docs/contributing/extensions.mdx @@ -4,8 +4,6 @@ description: How to build, publish, and contribute extensions for the Fleetbase sidebarTitle: Extensions --- -# Extension contributions - The biggest single way to contribute to Fleetbase is building an **extension** — a packaged module that other operators can install from the marketplace. Extensions can: @@ -83,7 +81,7 @@ Before you start building anything publishable: - A **developer account** on the Fleetbase Marketplace ([sign up](https://console.fleetbase.io/onboard)) - The **Fleetbase CLI** installed: `npm install -g @fleetbase/cli` -- A **local Fleetbase instance** for development (see [System Setup](/docs/platform/system-setup)) +- A **local Fleetbase instance** for development (see [System Setup](/docs/platform/system-setup/branding)) - **Stripe Connect** if you plan to charge for the extension Continue to [Extension Development](/docs/extension-development) for the full developer guide. diff --git a/content/docs/contributing/reporting-issues.mdx b/content/docs/contributing/reporting-issues.mdx index e7c0aac8..7885ef44 100644 --- a/content/docs/contributing/reporting-issues.mdx +++ b/content/docs/contributing/reporting-issues.mdx @@ -4,8 +4,6 @@ description: How to file effective bug reports and feature requests for Fleetbas sidebarTitle: Reporting issues --- -# Reporting issues - A good bug report makes the difference between a fix in days and a fix in months. This page covers how to file one well, where to file it, and what to expect after. ## Bug reports diff --git a/content/docs/contributing/translations/file-format.mdx b/content/docs/contributing/translations/file-format.mdx index 8707330b..6b98e71c 100644 --- a/content/docs/contributing/translations/file-format.mdx +++ b/content/docs/contributing/translations/file-format.mdx @@ -4,8 +4,6 @@ description: YAML structure, placeholder syntax, pluralization, and translation sidebarTitle: File format --- -# File format - Translation files are **YAML**. This page covers the structure, what to translate (and what to leave alone), and the conventions that keep translations consistent across locales. ## Anatomy of a locale file diff --git a/content/docs/contributing/translations/glossary.mdx b/content/docs/contributing/translations/glossary.mdx index 6e065fc8..0abd94c4 100644 --- a/content/docs/contributing/translations/glossary.mdx +++ b/content/docs/contributing/translations/glossary.mdx @@ -4,8 +4,6 @@ description: Brand names, technical terms, and domain vocabulary that should — sidebarTitle: Glossary --- -# Translation glossary - A reference for terms that come up repeatedly in Fleetbase translations. The default rule: translate everything that has a clear local equivalent. The exceptions below are documented because they tend to cause confusion. ## Brand names — never translate diff --git a/content/docs/contributing/translations/index.mdx b/content/docs/contributing/translations/index.mdx index 4f57eeb6..bd14b186 100644 --- a/content/docs/contributing/translations/index.mdx +++ b/content/docs/contributing/translations/index.mdx @@ -3,8 +3,6 @@ title: Translations description: Help translate Fleetbase Console and extensions into more languages — overview, what to translate, and how to get started. --- -# Translating Fleetbase - Fleetbase ships with translation infrastructure across the Console and every extension. New languages are contributed by community translators — operators, drivers, and developers who use Fleetbase in their region and want it to speak their language. This guide walks through the full process: how the system is structured, where the files live, how to translate them well, and how to submit your work. diff --git a/content/docs/contributing/translations/repositories.mdx b/content/docs/contributing/translations/repositories.mdx index c9802cb3..2163fe4d 100644 --- a/content/docs/contributing/translations/repositories.mdx +++ b/content/docs/contributing/translations/repositories.mdx @@ -4,8 +4,6 @@ description: Every Fleetbase repository that accepts translation contributions, sidebarTitle: Repositories --- -# Translation repositories - Fleetbase is split across many repositories — each maintained independently, each with its own translation files. To deliver a complete experience in a language, you typically contribute to multiple repos. This page is the full map. ## Console + extensions diff --git a/content/docs/contributing/translations/setup.mdx b/content/docs/contributing/translations/setup.mdx index 2bbb1f7b..54a6b144 100644 --- a/content/docs/contributing/translations/setup.mdx +++ b/content/docs/contributing/translations/setup.mdx @@ -4,8 +4,6 @@ description: Fork, clone, and prepare your environment to contribute Fleetbase t sidebarTitle: Setup --- -# Setup - This page covers the practical setup before you translate anything. None of it is Fleetbase-specific — if you've contributed to any GitHub project before, skim and skip. ## Prerequisites @@ -15,7 +13,7 @@ You need: - A **GitHub account** - **Git** installed locally - A **text editor** that handles YAML well (VS Code, Sublime, Vim, anything with syntax highlighting) -- *(Optional)* A way to run Fleetbase locally to preview your translation in context — see [Self-hosting](/docs/platform/system-setup) if you want to go this route +- *(Optional)* A way to run Fleetbase locally to preview your translation in context — see [Self-hosting](/docs/platform/system-setup/branding) if you want to go this route You don't need to run Fleetbase locally to contribute — you can translate the YAML files directly and rely on the maintainers to verify rendering during review. Running locally is faster feedback though, especially for languages that change UI sizing (long German words, RTL Arabic, dense CJK). diff --git a/content/docs/contributing/translations/submitting.mdx b/content/docs/contributing/translations/submitting.mdx index 3c39b2a9..a65bb06d 100644 --- a/content/docs/contributing/translations/submitting.mdx +++ b/content/docs/contributing/translations/submitting.mdx @@ -4,8 +4,6 @@ description: Pull request conventions, reviewer expectations, and what happens a sidebarTitle: Submitting --- -# Submitting your translation - You've translated some keys. Time to ship it. ## Before opening the PR diff --git a/content/docs/extending-fleetbase/backend-development.mdx b/content/docs/extending-fleetbase/backend-development.mdx index 74830283..d2ebbdea 100644 --- a/content/docs/extending-fleetbase/backend-development.mdx +++ b/content/docs/extending-fleetbase/backend-development.mdx @@ -3,8 +3,6 @@ title: Backend Development description: Build the server-side of your extension using PHP and Laravel — routes, models, controllers, and migrations. --- -# Backend Development - The backend of a Fleetbase extension is a standard **PHP Laravel Package**. If you are familiar with Laravel development, building a Fleetbase extension backend will feel very natural. You have full access to Eloquent ORM, routing, middleware, and the service container. diff --git a/content/docs/extending-fleetbase/dashboard-widgets.mdx b/content/docs/extending-fleetbase/dashboard-widgets.mdx index f90985c6..bdd63d17 100644 --- a/content/docs/extending-fleetbase/dashboard-widgets.mdx +++ b/content/docs/extending-fleetbase/dashboard-widgets.mdx @@ -3,8 +3,6 @@ title: Dashboard Widgets description: Build and register custom dashboard widgets that users can add to their Fleetbase dashboards. --- -# Dashboard Widgets - Fleetbase allows users to customize their dashboards by adding, removing, and rearranging widgets. As an extension developer, you can build custom widgets and register them with the platform, making them available for users to add to their own dashboards. diff --git a/content/docs/extending-fleetbase/extension-architecture.mdx b/content/docs/extending-fleetbase/extension-architecture.mdx index ce2814b6..87ca01ba 100644 --- a/content/docs/extending-fleetbase/extension-architecture.mdx +++ b/content/docs/extending-fleetbase/extension-architecture.mdx @@ -3,8 +3,6 @@ title: Extension Architecture description: "Understand the anatomy of a Fleetbase extension: the server package, the frontend engine, and the extension.json manifest." --- -# Extension Architecture - A Fleetbase extension is a self-contained module that adds new functionality to the core platform. Because Fleetbase is built on a decoupled architecture—a PHP Laravel backend and an Ember.js frontend—a complete extension typically consists of two distinct parts that communicate via an API. diff --git a/content/docs/extending-fleetbase/frontend-development.mdx b/content/docs/extending-fleetbase/frontend-development.mdx index c5333c92..ec8a6ea3 100644 --- a/content/docs/extending-fleetbase/frontend-development.mdx +++ b/content/docs/extending-fleetbase/frontend-development.mdx @@ -3,8 +3,6 @@ title: Frontend Development description: Build the frontend of your extension as an Ember.js engine — routes, components, and services. --- -# Frontend Development - The frontend of a Fleetbase extension is built as an **Ember.js Engine**. An Ember Engine is a self-contained Ember application that can be mounted inside a larger host application (in this case, the Fleetbase Console). This architecture allows you to build complex, multi-route UIs that feel like native parts of the platform. diff --git a/content/docs/extending-fleetbase/hooks-and-lifecycle.mdx b/content/docs/extending-fleetbase/hooks-and-lifecycle.mdx index 86a44835..a21cf489 100644 --- a/content/docs/extending-fleetbase/hooks-and-lifecycle.mdx +++ b/content/docs/extending-fleetbase/hooks-and-lifecycle.mdx @@ -3,8 +3,6 @@ title: Hooks & Lifecycle Events description: Tap into platform lifecycle events using hooks to run custom logic at key points in the application. --- -# Hooks & Lifecycle Events - Fleetbase provides a robust **Hooks** system that allows your extension to tap into key lifecycle events across the platform. This is particularly useful when you need to run custom logic in response to actions that occur outside of your extension's direct control (e.g., when a user logs in, when an order is created, or when a dashboard loads). diff --git a/content/docs/extending-fleetbase/index.mdx b/content/docs/extending-fleetbase/index.mdx index cbc0bcae..d34bc09d 100644 --- a/content/docs/extending-fleetbase/index.mdx +++ b/content/docs/extending-fleetbase/index.mdx @@ -3,8 +3,6 @@ title: Building & Extending Fleetbase description: Learn how to build extensions, integrate with the platform, and extend its functionality using Fleetbase's powerful extensibility system. --- -# Building & Extending Fleetbase - Fleetbase is designed from the ground up to be a modular, extensible platform. Rather than building a monolithic application that tries to do everything, Fleetbase provides a robust core and allows developers to build **Extensions** to add specific functionality. Whether you want to integrate a new payment gateway, add a custom dashboard widget, or build an entirely new logistics module like [Fleet-Ops](/docs/fleetops), the extensibility system provides the tools you need. diff --git a/content/docs/extending-fleetbase/menus-and-navigation.mdx b/content/docs/extending-fleetbase/menus-and-navigation.mdx index 951f2a47..e31230a9 100644 --- a/content/docs/extending-fleetbase/menus-and-navigation.mdx +++ b/content/docs/extending-fleetbase/menus-and-navigation.mdx @@ -3,8 +3,6 @@ title: Menus & Navigation description: Register your extension's menu items in the sidebar, header, settings panel, and admin area. --- -# Menus & Navigation - To make your extension accessible to users, you need to register its navigation links within the Fleetbase Console. This is done using the **Universe Service** in your frontend Ember Engine. The Universe Service acts as a central registry for all UI elements, allowing you to inject links into various menus across the platform. diff --git a/content/docs/extending-fleetbase/overview.mdx b/content/docs/extending-fleetbase/overview.mdx index 2aadc60d..090deb21 100644 --- a/content/docs/extending-fleetbase/overview.mdx +++ b/content/docs/extending-fleetbase/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: An introduction to Fleetbase's extensibility model — how extensions are structured and how they integrate with the platform. --- -# Overview - An introduction to Fleetbase's extensibility model — how extensions are structured and how they integrate with the platform. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/extending-fleetbase/publishing-to-marketplace.mdx b/content/docs/extending-fleetbase/publishing-to-marketplace.mdx index 4eb843b7..6e15d895 100644 --- a/content/docs/extending-fleetbase/publishing-to-marketplace.mdx +++ b/content/docs/extending-fleetbase/publishing-to-marketplace.mdx @@ -3,8 +3,6 @@ title: Publishing to the Marketplace description: Authenticate with the Fleetbase registry and publish your extension to the marketplace. --- -# Publishing to the Marketplace - Once you have finished building and testing your extension locally, you can publish it to the **Fleetbase Registry**. Publishing your extension makes it available in the Fleetbase Marketplace, allowing other users (or just other organizations within your own self-hosted instance) to discover and install it with a single click. diff --git a/content/docs/extending-fleetbase/registering-components.mdx b/content/docs/extending-fleetbase/registering-components.mdx index 9f4916cb..294ad505 100644 --- a/content/docs/extending-fleetbase/registering-components.mdx +++ b/content/docs/extending-fleetbase/registering-components.mdx @@ -3,8 +3,6 @@ title: Registering Components & UI description: Inject custom UI components into existing platform views using the component registry. --- -# Registering Components & UI - Beyond adding [Dashboard Widgets](/docs/extending-fleetbase/dashboard-widgets) and [Menu Items](/docs/extending-fleetbase/menus-and-navigation), the **Universe Service** allows you to inject custom UI components directly into existing views within the Fleetbase Console or other extensions. This is a powerful feature that allows you to extend the functionality of core modules without modifying their source code. diff --git a/content/docs/extending-fleetbase/scaffolding-your-extension.mdx b/content/docs/extending-fleetbase/scaffolding-your-extension.mdx index 7839b311..e3892b97 100644 --- a/content/docs/extending-fleetbase/scaffolding-your-extension.mdx +++ b/content/docs/extending-fleetbase/scaffolding-your-extension.mdx @@ -3,8 +3,6 @@ title: Scaffolding Your Extension description: Use the Fleetbase CLI to scaffold a new extension with a working backend and frontend skeleton. --- -# Scaffolding Your Extension - The easiest way to start building a new Fleetbase extension is to use the **Fleetbase CLI**. The CLI provides a `scaffold` command that generates a complete, working extension skeleton, including both the [Backend](/docs/extending-fleetbase/backend-development) (Laravel package) and the [Frontend](/docs/extending-fleetbase/frontend-development) (Ember Engine), along with the necessary `extension.json` manifest. diff --git a/content/docs/extending-fleetbase/virtual-routes.mdx b/content/docs/extending-fleetbase/virtual-routes.mdx index ad85e741..078c5766 100644 --- a/content/docs/extending-fleetbase/virtual-routes.mdx +++ b/content/docs/extending-fleetbase/virtual-routes.mdx @@ -3,8 +3,6 @@ title: Virtual Routes & Deep Linking description: Understand how virtual routes work in Fleetbase and how to implement deep linking in your extension. --- -# Virtual Routes & Deep Linking - In a traditional Ember application, every URL corresponds to a specific, hardcoded route defined in the `router.js` file. However, because Fleetbase is a modular platform where extensions can be installed and uninstalled dynamically, the core router cannot know about every possible route ahead of time. diff --git a/content/docs/extension-development/architecture/extension-registration.mdx b/content/docs/extension-development/architecture/extension-registration.mdx index 6ce990da..af016fed 100644 --- a/content/docs/extension-development/architecture/extension-registration.mdx +++ b/content/docs/extension-development/architecture/extension-registration.mdx @@ -3,8 +3,6 @@ title: Extension Registration description: How addon/extension.js wires your extension into the Fleetbase console boot lifecycle. The setupExtension hook, onEngineLoaded, and the contract every extension implements. --- -# Extension Registration - Every Fleetbase extension declares a single **`addon/extension.js`** at the root of its addon. The console's `ExtensionManager` finds this file at boot, dynamic-imports it, and runs its registration hooks. This is the **single canonical entry point** — registration code does **not** live in `engine.js`, instance initializers, or anywhere else. diff --git a/content/docs/extension-development/architecture/overview.mdx b/content/docs/extension-development/architecture/overview.mdx index 13b96c73..2be4e585 100644 --- a/content/docs/extension-development/architecture/overview.mdx +++ b/content/docs/extension-development/architecture/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: A Fleetbase extension is a single repository with two halves — an Ember.js addon (the console UI) and a Laravel package (the API). The extension.json manifest ties them together and addon/extension.js is the registration entry point. --- -# Architecture Overview - A Fleetbase extension is **one repository with two halves**: 1. An **Ember.js addon** under `addon/` — your console UI diff --git a/content/docs/extension-development/backend/expansions-and-observers.mdx b/content/docs/extension-development/backend/expansions-and-observers.mdx index ee5aaafe..4ac39acc 100644 --- a/content/docs/extension-development/backend/expansions-and-observers.mdx +++ b/content/docs/extension-development/backend/expansions-and-observers.mdx @@ -3,8 +3,6 @@ title: Expansions & Observers description: React to model lifecycle events with observers, and add methods to core models or Laravel facades with expansions — both auto-loaded by your service provider. --- -# Expansions & Observers - Two patterns let your extension hook into other code without owning it: **observers** for model lifecycle events, and **expansions** for adding methods to a class you don't own. ## Observers diff --git a/content/docs/extension-development/backend/migrations.mdx b/content/docs/extension-development/backend/migrations.mdx index 3de5ad90..0305c60d 100644 --- a/content/docs/extension-development/backend/migrations.mdx +++ b/content/docs/extension-development/backend/migrations.mdx @@ -3,8 +3,6 @@ title: Migrations description: Define database migrations for your extension. They live under server/migrations/, follow Fleetbase's UUID + public_id conventions, and load automatically via the service provider. --- -# Migrations - Migrations define the schema your extension owns. Fleetbase auto-loads them via your [service provider](/docs/extension-development/backend/service-provider) (`$this->loadMigrationsFrom(__DIR__ . '/../../migrations')`), so they run alongside core migrations whenever someone runs `php artisan migrate`. ## Where Migrations Live diff --git a/content/docs/extension-development/backend/routes-and-controllers.mdx b/content/docs/extension-development/backend/routes-and-controllers.mdx index f0566c4a..7cf8670e 100644 --- a/content/docs/extension-development/backend/routes-and-controllers.mdx +++ b/content/docs/extension-development/backend/routes-and-controllers.mdx @@ -3,8 +3,6 @@ title: Routes & Controllers description: Define API routes with Fleetbase route macros, choose the right middleware group, and build resource controllers backed by HasApiControllerBehavior. --- -# Routes & Controllers - Routes for an extension live in **`server/src/routes.php`** (loaded by your service provider via `loadRoutesFrom`). Route definitions follow Laravel conventions — Fleetbase adds three macros that take care of the boilerplate. ## The Routes File diff --git a/content/docs/extension-development/backend/service-provider.mdx b/content/docs/extension-development/backend/service-provider.mdx index de872af3..48982690 100644 --- a/content/docs/extension-development/backend/service-provider.mdx +++ b/content/docs/extension-development/backend/service-provider.mdx @@ -3,8 +3,6 @@ title: Service Provider description: The Laravel service provider is the entry point for your extension's backend. It loads routes, migrations, observers, expansions, middleware, and binds services into the container. --- -# Service Provider - The backend half of an extension is a Laravel package. Your service provider is its entry point — Composer auto-discovers it via the `extra.laravel.providers` array in `composer.json`, and Laravel boots it on every request. Fleetbase ships a base service provider, **`Fleetbase\Providers\CoreServiceProvider`**, that does most of the wiring for you. Extend it (don't extend Laravel's `ServiceProvider` directly) so you inherit observer auto-registration, middleware groups, expansion loading, and the rest. diff --git a/content/docs/extension-development/frontend/routing.mdx b/content/docs/extension-development/frontend/routing.mdx index e150286a..07ba90dc 100644 --- a/content/docs/extension-development/frontend/routing.mdx +++ b/content/docs/extension-development/frontend/routing.mdx @@ -3,8 +3,6 @@ title: Routing description: How an extension's frontend Ember engine is structured — engine.js, routes.js, host service dependencies, and how routes are mounted into the Fleetbase console. --- -# Routing - The frontend half of an extension is an **Ember engine** mounted inside the Fleetbase console. The console handles top-level chrome (header, sidebar, auth) and routes any URL under `/console/<your-mount>/…` into your engine. ## The Addon Layout diff --git a/content/docs/extension-development/frontend/templates-and-components.mdx b/content/docs/extension-development/frontend/templates-and-components.mdx index 9697cb6b..0bf51ee1 100644 --- a/content/docs/extension-development/frontend/templates-and-components.mdx +++ b/content/docs/extension-development/frontend/templates-and-components.mdx @@ -3,8 +3,6 @@ title: Templates & Components description: Build engine templates and Glimmer components using @fleetbase/ember-ui — layout primitives, common widgets, and how to render extension components inside other engines. --- -# Templates & Components - Engine templates use standard Handlebars + Ember. The console ships a large component library — **`@fleetbase/ember-ui`** — that gives you matching chrome (layouts, headers, tables, modals, form inputs) without re-implementing styles. ## Templates diff --git a/content/docs/extension-development/frontend/virtual-routes.mdx b/content/docs/extension-development/frontend/virtual-routes.mdx index 887443ea..b6876d92 100644 --- a/content/docs/extension-development/frontend/virtual-routes.mdx +++ b/content/docs/extension-development/frontend/virtual-routes.mdx @@ -3,8 +3,6 @@ title: Virtual Routes description: How Fleetbase resolves dynamically-registered URLs against menu-item registries to render extension components without hardcoded routes. --- -# Virtual Routes - Fleetbase ships with a fixed set of console routes — `/console`, `/console/settings`, `/console/admin`, `/console/account`, etc. Extensions can't add to that route table at runtime. **Virtual routes** are how extensions register pages anyway: a menu item declares a `slug` plus a component, and a built-in `virtual` route on the host renders that component when the URL matches. There is no `_virtual: true` flag. Virtual is a property of the *route* the menu item targets, not the menu item itself. diff --git a/content/docs/extension-development/getting-started/extension-anatomy.mdx b/content/docs/extension-development/getting-started/extension-anatomy.mdx index 8755d01f..842ec2bf 100644 --- a/content/docs/extension-development/getting-started/extension-anatomy.mdx +++ b/content/docs/extension-development/getting-started/extension-anatomy.mdx @@ -3,8 +3,6 @@ title: Extension Anatomy description: A tour of a scaffolded Fleetbase extension — addon/, server/, extension.json, and the key entry points (addon/extension.js, the engine, the service provider). --- -# Extension Anatomy - A scaffolded extension is a single repository that ships **two halves**: - **`addon/`** — an Ember.js addon (the console UI) diff --git a/content/docs/extension-development/getting-started/quickstart.mdx b/content/docs/extension-development/getting-started/quickstart.mdx index 9f01a85d..ef29c7d0 100644 --- a/content/docs/extension-development/getting-started/quickstart.mdx +++ b/content/docs/extension-development/getting-started/quickstart.mdx @@ -3,8 +3,6 @@ title: Quickstart description: Use the Fleetbase CLI to scaffold a new extension with a working backend and frontend skeleton. --- -# Quickstart - The easiest way to start building a new Fleetbase extension is to use the **Fleetbase CLI**. The CLI provides a `scaffold` command that generates a complete, working extension skeleton, including both the [Backend](/docs/extension-development/backend/service-provider) (Laravel package) and the [Frontend](/docs/extension-development/frontend/routing) (Ember Engine), along with the necessary `extension.json` manifest. diff --git a/content/docs/extension-development/publishing/overview.mdx b/content/docs/extension-development/publishing/overview.mdx index 232f09f6..bc0d328a 100644 --- a/content/docs/extension-development/publishing/overview.mdx +++ b/content/docs/extension-development/publishing/overview.mdx @@ -3,8 +3,6 @@ title: Publishing to the Marketplace description: Authenticate with the Fleetbase registry and publish your extension using the CLI. --- -# Publishing to the Marketplace - Once you have finished building and testing your extension locally, you can publish it to the **Fleetbase Registry**. Publishing your extension makes it available in the Fleetbase Marketplace, allowing other users (or just other organizations within your own self-hosted instance) to discover and install it with a single click. diff --git a/content/docs/extension-development/recipes/adding-a-payment-gateway-driver.mdx b/content/docs/extension-development/recipes/adding-a-payment-gateway-driver.mdx index f77f10d8..dd0e29d1 100644 --- a/content/docs/extension-development/recipes/adding-a-payment-gateway-driver.mdx +++ b/content/docs/extension-development/recipes/adding-a-payment-gateway-driver.mdx @@ -3,8 +3,6 @@ title: Adding a Payment Gateway Driver description: Plug a new payment gateway (PayPal, Razorpay, etc.) into Ledger by extending AbstractGatewayDriver and registering it with the PaymentGatewayManager. --- -# Adding a Payment Gateway Driver - The [Ledger](https://github.com/fleetbase/ledger) extension uses a Laravel [`Manager`](https://laravel.com/api/11.x/Illuminate/Support/Manager.html)-based driver pattern for payment gateways. Stripe, QPay, and Cash drivers ship by default — third-party drivers register via `PaymentGatewayManager::extend()`. ## What a Driver Implements diff --git a/content/docs/extension-development/recipes/adding-a-sms-provider.mdx b/content/docs/extension-development/recipes/adding-a-sms-provider.mdx index 0b57bcd4..47121d11 100644 --- a/content/docs/extension-development/recipes/adding-a-sms-provider.mdx +++ b/content/docs/extension-development/recipes/adding-a-sms-provider.mdx @@ -3,8 +3,6 @@ title: Adding a SMS Provider description: Plug a new SMS gateway into the platform's SmsService — implement a sender class, wire it through configuration, and route specific phone-number prefixes to it. --- -# Adding a SMS Provider - The platform's `Fleetbase\Services\SmsService` ships with Twilio (default) and CallPro. Both implement the same minimal contract: a constructor that reads config, plus a `send($to, $text, $options?)` method. Adding a third provider is a matter of writing the sender class, exposing it via config, and (if you want auto-routing) updating the routing rules. ## 1. Implement the Provider Class diff --git a/content/docs/extension-development/recipes/adding-an-integrated-vendor.mdx b/content/docs/extension-development/recipes/adding-an-integrated-vendor.mdx index 828c129f..3a18bf5c 100644 --- a/content/docs/extension-development/recipes/adding-an-integrated-vendor.mdx +++ b/content/docs/extension-development/recipes/adding-an-integrated-vendor.mdx @@ -3,8 +3,6 @@ title: Adding an Integrated Vendor description: Wire a third-party logistics provider into Fleet-Ops as a selectable IntegratedVendor — credentials form, API bridge, lifecycle callbacks, and webhook routing. --- -# Adding an Integrated Vendor - Fleet-Ops's **IntegratedVendor** system lets users connect external delivery providers (Lalamove, etc.) and dispatch orders to them as if they were internal vendors. The integration consists of: 1. A **bridge class** — wraps the third-party API diff --git a/content/docs/extension-development/recipes/calling-your-extension-api.mdx b/content/docs/extension-development/recipes/calling-your-extension-api.mdx index c78918d4..7dec06fd 100644 --- a/content/docs/extension-development/recipes/calling-your-extension-api.mdx +++ b/content/docs/extension-development/recipes/calling-your-extension-api.mdx @@ -3,8 +3,6 @@ title: Calling Your Extension's API description: Make authenticated requests from your engine to your extension's backend by passing the right namespace to the fetch service. --- -# Calling Your Extension's API - The `fetch` service knows how to call **the console's** API by default — but your extension exposes its own routes under its own prefix, and those calls need to go there instead. This recipe covers the patterns: per-call namespace, controller-level shorthand, and a dedicated wrapper service. ## The Problem diff --git a/content/docs/extension-development/recipes/connecting-models-to-your-api.mdx b/content/docs/extension-development/recipes/connecting-models-to-your-api.mdx index 69ea2941..72de93c7 100644 --- a/content/docs/extension-development/recipes/connecting-models-to-your-api.mdx +++ b/content/docs/extension-development/recipes/connecting-models-to-your-api.mdx @@ -3,8 +3,6 @@ title: Connecting Models to Your Extension API description: Wire Ember Data models to your extension's API by extending ApplicationAdapter with the right namespace, then point each model at the right adapter. --- -# Connecting Models to Your Extension API - Ember Data drives most CRUD interactions in the console — `store.findRecord`, `store.query`, `record.save()`. When you load records from your **own** API instead of the console's default namespace, you do it once at the **adapter** layer rather than passing options on every call. ## Why an Adapter? diff --git a/content/docs/extension-development/recipes/registering-a-report-schema.mdx b/content/docs/extension-development/recipes/registering-a-report-schema.mdx index 0e8c05cb..9532ad95 100644 --- a/content/docs/extension-development/recipes/registering-a-report-schema.mdx +++ b/content/docs/extension-development/recipes/registering-a-report-schema.mdx @@ -3,8 +3,6 @@ title: Registering a Report Schema description: Expose your extension's tables in the platform's report builder by registering a ReportSchema. Users can then build custom reports against your data through the standard reporting UI. --- -# Registering a Report Schema - The platform ships a generic report builder that lets users build CSV/XLSX reports from any data source registered as a **report schema**. Fleet-Ops registers schemas for orders, drivers, vehicles, and others — your extension can register schemas for its own tables the same way. ## What a Report Schema Provides diff --git a/content/docs/extension-development/recipes/registering-notifications.mdx b/content/docs/extension-development/recipes/registering-notifications.mdx index f2145e3a..36fe724e 100644 --- a/content/docs/extension-development/recipes/registering-notifications.mdx +++ b/content/docs/extension-development/recipes/registering-notifications.mdx @@ -3,8 +3,6 @@ title: Registering Notifications description: Define notification classes that show up in user notification preferences and dispatch via mail, SMS, push, broadcast, and database channels. --- -# Registering Notifications - The platform's `NotificationRegistry` is the **directory of opt-in notifications** users see in their settings. Each registered notification class can fire across mail, SMS, broadcast (real-time UI), database (in-app feed), FCM (Android push), and APN (iOS push) — and users pick which channels to receive each notification on. Without registration, your notification will still send (it's just a Laravel notification), but users won't see it in their preferences UI and won't be able to opt in or out. diff --git a/content/docs/extension-development/reference/api-services.mdx b/content/docs/extension-development/reference/api-services.mdx index 343f2711..28c62d69 100644 --- a/content/docs/extension-development/reference/api-services.mdx +++ b/content/docs/extension-development/reference/api-services.mdx @@ -3,8 +3,6 @@ title: API Services description: Backend support classes shipped by fleetbase/core-api — SmsService, the Support\Http and Support\Find/Resolve helpers, NotificationRegistry, and the SocketCluster broadcaster. --- -# API Services - `fleetbase/core-api` ships a set of support classes you can rely on instead of rebuilding them per extension. This page surveys the most important ones and shows the canonical usage. Source files for each are linked at the bottom. For frontend host services (the `fetch`, `store`, `notifications`, etc. you inject in your engine), see [Ember Services](/docs/extension-development/reference/ember-services). diff --git a/content/docs/extension-development/reference/contracts.mdx b/content/docs/extension-development/reference/contracts.mdx index 6570cc77..40b34a90 100644 --- a/content/docs/extension-development/reference/contracts.mdx +++ b/content/docs/extension-development/reference/contracts.mdx @@ -3,8 +3,6 @@ title: Contracts description: Reference for every contract in @fleetbase/ember-core/contracts — MenuItem, MenuPanel, Widget, Hook, ExtensionComponent, Registry, TemplateHelper, BaseContract. --- -# Contracts - The **contracts** in `@fleetbase/ember-core/contracts` are the canonical shapes you pass to the Universe sub-services. Use them — they validate inputs, normalize defaults, and serialize correctly when stored in registries. ## Importing diff --git a/content/docs/extension-development/reference/decorators.mdx b/content/docs/extension-development/reference/decorators.mdx index f6a2dc21..148d48a5 100644 --- a/content/docs/extension-development/reference/decorators.mdx +++ b/content/docs/extension-development/reference/decorators.mdx @@ -3,8 +3,6 @@ title: Decorators description: "Property decorators from @fleetbase/ember-core for cross-engine service injection and lazy data loading: @engineService, @fromStore, and @fetchFrom." --- -# Decorators - `@fleetbase/ember-core` ships three custom property decorators for the patterns Ember's built-in `@service` doesn't cover: pulling a service from another engine, lazily querying the store on first access, and lazily fetching from the API on first access. ## `@engineService` diff --git a/content/docs/extension-development/reference/ember-services.mdx b/content/docs/extension-development/reference/ember-services.mdx index b0f778b9..a2b151bc 100644 --- a/content/docs/extension-development/reference/ember-services.mdx +++ b/content/docs/extension-development/reference/ember-services.mdx @@ -3,8 +3,6 @@ title: Ember Services description: Reference for the host services your extension consumes — fetch, store, current-user, session, abilities, intl, notifications, socket, crud, chat, theme, modalsManager, events, app-cache, language, hostRouter, and more. --- -# Ember Services - Your engine inherits a tree of Ember services from [`@fleetbase/ember-core/exports`](https://github.com/fleetbase/ember-core/blob/main/addon/exports/services.js). Each is built on Ember's <EmberApi path="classes/Service">Service</EmberApi> base class and is injectable via Ember's <EmberApi path="classes/Service/methods/inject?anchor=inject">@service</EmberApi> decorator from any route, controller, component, or service in your engine: ```js diff --git a/content/docs/extension-development/universe/extension-manager.mdx b/content/docs/extension-development/universe/extension-manager.mdx index 48217331..ce2ecb8c 100644 --- a/content/docs/extension-development/universe/extension-manager.mdx +++ b/content/docs/extension-development/universe/extension-manager.mdx @@ -3,8 +3,6 @@ title: Extension Manager description: Lazy-load engines on demand, react to engine load events, share host services and components into engines, and inspect installed-extension state. --- -# Extension Manager - The **extension manager** (`universe/extension-manager`) is the engine-aware sub-service. While the menu, registry, widget, and hook services manage data, the extension manager manages **engines themselves** — when they boot, when their setup callbacks fire, and what state they're in. You'll mostly reach it through the [`UniverseService` façade](/docs/extension-development/universe/overview) (`universe.whenEngineLoaded(…)`) — but the underlying service has more surface for advanced cases like cross-engine service sharing. diff --git a/content/docs/extension-development/universe/hook-service.mdx b/content/docs/extension-development/universe/hook-service.mdx index a5821ca4..b94bbfd8 100644 --- a/content/docs/extension-development/universe/hook-service.mdx +++ b/content/docs/extension-development/universe/hook-service.mdx @@ -3,8 +3,6 @@ title: Hook Service description: Tap into platform lifecycle events using hooks to run logic at key points in the application — login, route transitions, console boot, and custom events you fire yourself. --- -# Hook Service - The **hook service** (`universe/hook-service`) is a typed event bus shared across all engines. Extensions register handlers for named events; the platform (and other extensions) execute them at the right moment. Hooks live in a singleton registry on the root application, so a hook registered in one engine fires for events emitted in another. That's how the customer portal redirects authenticated customers from the main console (`console:before-model`) without either engine knowing about the other. diff --git a/content/docs/extension-development/universe/menu-service.mdx b/content/docs/extension-development/universe/menu-service.mdx index 207c0c21..fdf36f38 100644 --- a/content/docs/extension-development/universe/menu-service.mdx +++ b/content/docs/extension-development/universe/menu-service.mdx @@ -3,8 +3,6 @@ title: Menu Service description: Register navigation entries in the console — header items, settings panels, admin panels, organization & user menus, and custom registries — via universe.getService('menu'). --- -# Menu Service - The `menu` service is how your extension contributes navigation entries to the console. It exposes dedicated registrars for each major menu surface, plus a generic registrar for custom registries (`auth:login`, `engine:fleet-ops`, etc.). ```js diff --git a/content/docs/extension-development/universe/overview.mdx b/content/docs/extension-development/universe/overview.mdx index ca253634..3e3f416f 100644 --- a/content/docs/extension-development/universe/overview.mdx +++ b/content/docs/extension-development/universe/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: The UniverseService is the central extensibility facade in @fleetbase/ember-core. It exposes five sub-services for menus, registries, widgets, hooks, and engines — and is the single entry point your extension uses to plug into the console. --- -# Universe Service - The **`UniverseService`** is the central extensibility facade in `@fleetbase/ember-core`. It is the entry point your extension uses to register everything: menu items, components, widgets, hooks, registries, and engine integrations. You access it through the `setupExtension(app, universe)` hook in your `addon/extension.js`: diff --git a/content/docs/extension-development/universe/registry-service.mdx b/content/docs/extension-development/universe/registry-service.mdx index 2398cce0..a8c37a30 100644 --- a/content/docs/extension-development/universe/registry-service.mdx +++ b/content/docs/extension-development/universe/registry-service.mdx @@ -3,8 +3,6 @@ title: Registry Service description: Create registries, register components into other extensions' slots, and register cross-engine components, services, and helpers — via universe.getService('registry'). --- -# Registry Service - The `registry` service is the storage layer behind the menu, widget, and hook services — and the place to register your own component contributions and registries. You'll touch it for two main reasons: diff --git a/content/docs/extension-development/universe/widget-service.mdx b/content/docs/extension-development/universe/widget-service.mdx index 9696a04f..8be168e4 100644 --- a/content/docs/extension-development/universe/widget-service.mdx +++ b/content/docs/extension-development/universe/widget-service.mdx @@ -3,8 +3,6 @@ title: Widget Service description: Register dashboards and widgets that show up on the Fleetbase home dashboard or your extension's own dashboard surface. --- -# Widget Service - The **widget service** (`universe/widget-service`) manages two registries used by the dashboard: - **Dashboards** — named groups of widgets (`'dashboard'` is the built-in console home; you can register your own) diff --git a/content/docs/fleet-ops/analytics/overview.mdx b/content/docs/fleet-ops/analytics/overview.mdx index 6b04374b..cd194692 100644 --- a/content/docs/fleet-ops/analytics/overview.mdx +++ b/content/docs/fleet-ops/analytics/overview.mdx @@ -3,8 +3,6 @@ title: Analytics Overview description: Build custom reports against the Fleet-Ops dataset using a query-builder UI — pick tables, columns, joins, filters, and exports. --- -# Analytics Overview - The **Analytics** section of Fleet-Ops gives you a query-builder over the Fleet-Ops dataset. Reports are configured visually — pick a primary table, select columns, add joins to related tables, layer in filters and aggregates, and run the query to render a table you can export. ![Fleet-Ops report builder — primary table picker, columns, joins, conditions, and results table](/images/screenshots/fleet-ops/fleet-ops-report-builder.webp) diff --git a/content/docs/fleet-ops/analytics/reports/overview.mdx b/content/docs/fleet-ops/analytics/reports/overview.mdx index 35d4226b..e3dce05a 100644 --- a/content/docs/fleet-ops/analytics/reports/overview.mdx +++ b/content/docs/fleet-ops/analytics/reports/overview.mdx @@ -3,8 +3,6 @@ title: Reports description: Build, run, save, and export custom reports against your Fleet-Ops data using a visual report builder — no SQL required. --- -# Reports - The Reports section is where you build custom data exports of your Fleet-Ops operation. Pick a starting table (orders, drivers, vehicles, etc.), choose which fields you want, layer in filters and sorting, optionally pull in fields from related tables, and run the report to see the result. Save it, re-run it whenever you want, and export to CSV or XLSX. Reports are **table-based today** — every report produces rows in a table. Charts, summary cards, and pre-built dashboards are on the roadmap but not yet available. diff --git a/content/docs/fleet-ops/connectivity/devices/overview.mdx b/content/docs/fleet-ops/connectivity/devices/overview.mdx index 6f5d9a41..e1ae7ed3 100644 --- a/content/docs/fleet-ops/connectivity/devices/overview.mdx +++ b/content/docs/fleet-ops/connectivity/devices/overview.mdx @@ -3,8 +3,6 @@ title: Devices description: Manage GPS trackers, OBD-II scanners, dash cameras, and other IoT devices connected to your fleet vehicles. --- -# Devices - **Devices** are the physical hardware units connected to your fleet vehicles — GPS trackers, OBD-II scanners, dash cameras, and IoT sensors. While telematics modems are managed in the Telematics section (they bridge to a provider's cloud), Devices tracks the individual hardware installed in or on vehicles. Navigate to **Fleet-Ops → Connectivity → Devices**. diff --git a/content/docs/fleet-ops/connectivity/events/overview.mdx b/content/docs/fleet-ops/connectivity/events/overview.mdx index bdec65cd..94591cc0 100644 --- a/content/docs/fleet-ops/connectivity/events/overview.mdx +++ b/content/docs/fleet-ops/connectivity/events/overview.mdx @@ -3,8 +3,6 @@ title: Device Events description: View and inspect raw device and sensor events — GPS readings, OBD-II data, sensor values, and system events from connected fleet hardware. --- -# Device Events - **Device Events** are the raw data points received from connected fleet hardware — GPS position updates, OBD-II diagnostic readings, sensor values, and alert events. Every time a device or sensor sends data to Fleet-Ops, a DeviceEvent is recorded. Navigate to **Fleet-Ops → Connectivity → Events**. diff --git a/content/docs/fleet-ops/connectivity/overview.mdx b/content/docs/fleet-ops/connectivity/overview.mdx index 965b5708..3e5e28b3 100644 --- a/content/docs/fleet-ops/connectivity/overview.mdx +++ b/content/docs/fleet-ops/connectivity/overview.mdx @@ -3,8 +3,6 @@ title: Connectivity Overview description: Connect Fleet-Ops to external hardware — telematics modems, GPS devices, IoT sensors, and third-party data providers. --- -# Connectivity Overview - The **Connectivity** section of Fleet-Ops manages the integration of physical hardware and external data providers. This includes telematics modems installed in vehicles, GPS and IoT devices, environmental sensors, and the raw data events they produce. ![Fleet-Ops connectivity sidebar — Telematics, Devices, Sensors, Events](/images/screenshots/fleet-ops/fleet-ops-flespi-telematics-integration.webp) diff --git a/content/docs/fleet-ops/connectivity/sensors/overview.mdx b/content/docs/fleet-ops/connectivity/sensors/overview.mdx index 0b323613..ddf2a6bc 100644 --- a/content/docs/fleet-ops/connectivity/sensors/overview.mdx +++ b/content/docs/fleet-ops/connectivity/sensors/overview.mdx @@ -3,8 +3,6 @@ title: Sensors description: Manage environmental and condition sensors — temperature, humidity, door, pressure, and motion monitoring for cargo and vehicle condition tracking. --- -# Sensors - **Sensors** are environmental and condition monitoring devices installed in vehicle cargo areas or attached to equipment. They provide real-time data about the state of the cargo environment (temperature, humidity) or physical events (door opened, impact detected). Sensor data is ingested from telematics devices or directly from connected hardware. Navigate to **Fleet-Ops → Connectivity → Sensors**. diff --git a/content/docs/fleet-ops/connectivity/telematics/overview.mdx b/content/docs/fleet-ops/connectivity/telematics/overview.mdx index 1925e89a..50d430e9 100644 --- a/content/docs/fleet-ops/connectivity/telematics/overview.mdx +++ b/content/docs/fleet-ops/connectivity/telematics/overview.mdx @@ -3,8 +3,6 @@ title: Telematics description: Connect telematics providers to Fleet-Ops — enter API credentials, discover devices, link them to vehicles, and start receiving live telemetry data. --- -# Telematics - **Telematics** devices are modems installed in vehicles that continuously transmit GPS position, engine diagnostics, and sensor data to a telematics provider's cloud platform. Fleet-Ops connects to supported providers via API to ingest this data in real time. Navigate to **Fleet-Ops → Connectivity → Telematics**. diff --git a/content/docs/fleet-ops/getting-started/core-concepts.mdx b/content/docs/fleet-ops/getting-started/core-concepts.mdx index 339e5472..c659af71 100644 --- a/content/docs/fleet-ops/getting-started/core-concepts.mdx +++ b/content/docs/fleet-ops/getting-started/core-concepts.mdx @@ -3,8 +3,6 @@ title: Core Concepts description: "Understand the key building blocks of Fleet-Ops: orders, payloads, drivers, vehicles, fleets, and how they relate." --- -# Core Concepts - Fleet-Ops is built around a set of entities that represent the real-world objects in your logistics operation. Understanding how these entities relate to each other is the key to using Fleet-Ops effectively. ## Orders diff --git a/content/docs/fleet-ops/getting-started/navigator-app-setup.mdx b/content/docs/fleet-ops/getting-started/navigator-app-setup.mdx index fc381bff..b62c6dfa 100644 --- a/content/docs/fleet-ops/getting-started/navigator-app-setup.mdx +++ b/content/docs/fleet-ops/getting-started/navigator-app-setup.mdx @@ -3,8 +3,6 @@ title: Navigator App Setup description: Install the Navigator driver app, link it to your Fleet-Ops instance, and get a driver logged in before their first dispatch. --- -# Navigator App Setup - **Navigator** is the React Native mobile app drivers use to receive dispatched orders, navigate routes, fire activity steps, capture proof of delivery, report issues, and submit fuel reports. It is open source — the source lives at [github.com/fleetbase/navigator-app](https://github.com/fleetbase/navigator-app) — and ships as both an iOS and Android app. ## 1. Install Navigator diff --git a/content/docs/fleet-ops/getting-started/quickstart.mdx b/content/docs/fleet-ops/getting-started/quickstart.mdx index e004cc9d..aa51010b 100644 --- a/content/docs/fleet-ops/getting-started/quickstart.mdx +++ b/content/docs/fleet-ops/getting-started/quickstart.mdx @@ -3,8 +3,6 @@ title: Quickstart description: Get up and running with Fleet-Ops in minutes — create your first order, assign a driver, and dispatch. --- -# Quickstart - This guide walks you through creating your first order in Fleet-Ops, assigning it to a driver, and dispatching it to the Navigator app. It assumes Fleet-Ops is installed and you have at least one driver account set up. ## Prerequisites diff --git a/content/docs/fleet-ops/maintenance/equipment/overview.mdx b/content/docs/fleet-ops/maintenance/equipment/overview.mdx index 7804a65f..24add196 100644 --- a/content/docs/fleet-ops/maintenance/equipment/overview.mdx +++ b/content/docs/fleet-ops/maintenance/equipment/overview.mdx @@ -3,8 +3,6 @@ title: Equipment description: Track fleet equipment assets — tools, trailers, containers — with maintenance schedules, work orders, and warranty coverage. --- -# Equipment - **Equipment** tracks fleet assets beyond vehicles — tools, trailers, containers, attachments, and other hardware that require their own maintenance schedules and work orders. Equipment records are linked to vehicles or drivers and participate in the same maintenance workflow as vehicles. ![Equipment list — name, category, assigned vehicle, status, next maintenance date](/images/screenshots/fleet-ops/fleet-ops-equipment-list.webp) diff --git a/content/docs/fleet-ops/maintenance/overview.mdx b/content/docs/fleet-ops/maintenance/overview.mdx index 6ade16ec..7c2972a0 100644 --- a/content/docs/fleet-ops/maintenance/overview.mdx +++ b/content/docs/fleet-ops/maintenance/overview.mdx @@ -3,8 +3,6 @@ title: Maintenance Overview description: Manage vehicle and equipment maintenance — preventive schedules, work orders, parts inventory, and maintenance history. --- -# Maintenance Overview - The **Maintenance** section of Fleet-Ops provides tools to keep your fleet in operating condition. It covers preventive maintenance scheduling, work order assignment and tracking, parts inventory, and equipment management. ![Fleet-Ops maintenance sidebar — Schedules, Work Orders, Maintenances, Equipment, Parts](/images/screenshots/fleet-ops/fleet-ops-maintenance-log.webp) diff --git a/content/docs/fleet-ops/maintenance/parts/overview.mdx b/content/docs/fleet-ops/maintenance/parts/overview.mdx index 6e4350a2..00674483 100644 --- a/content/docs/fleet-ops/maintenance/parts/overview.mdx +++ b/content/docs/fleet-ops/maintenance/parts/overview.mdx @@ -3,8 +3,6 @@ title: Parts description: Track parts inventory used in fleet maintenance — log parts used in work orders, manage supplier info, and track costs. --- -# Parts - **Parts** is the inventory management section for maintenance components. It tracks the parts available for vehicle and equipment maintenance — oil filters, brake pads, belts, fluids, and any other consumables used in work orders. ![Parts inventory list — part name, SKU, supplier, cost per unit, quantity](/images/screenshots/fleet-ops/fleet-ops-parts-inventory.webp) diff --git a/content/docs/fleet-ops/maintenance/schedules/overview.mdx b/content/docs/fleet-ops/maintenance/schedules/overview.mdx index 2bb99c99..93b94cbf 100644 --- a/content/docs/fleet-ops/maintenance/schedules/overview.mdx +++ b/content/docs/fleet-ops/maintenance/schedules/overview.mdx @@ -3,8 +3,6 @@ title: Maintenance Schedules description: Set up preventive maintenance rules for vehicles and equipment — trigger work orders automatically by mileage, engine hours, or calendar interval. --- -# Maintenance Schedules - **Maintenance Schedules** are preventive maintenance rules that monitor vehicles and equipment and automatically generate work orders when service is due. Each schedule defines a target (vehicle or equipment), an interval method, and thresholds — Fleet-Ops tracks usage and fires work orders when the threshold is reached. ![Maintenance schedules list — vehicle, schedule name, interval type, next due date, status](/images/screenshots/fleet-ops/fleet-ops-maintenance-schedules.webp) diff --git a/content/docs/fleet-ops/maintenance/work-orders/overview.mdx b/content/docs/fleet-ops/maintenance/work-orders/overview.mdx index f6ae1e30..964c78fd 100644 --- a/content/docs/fleet-ops/maintenance/work-orders/overview.mdx +++ b/content/docs/fleet-ops/maintenance/work-orders/overview.mdx @@ -3,8 +3,6 @@ title: Work Orders description: Create, assign, and track maintenance work orders — from initial task assignment through checklist completion and cost tracking to closure. --- -# Work Orders - A **Work Order** is an assigned maintenance or repair task. Work orders can be generated automatically from maintenance schedules when service thresholds are reached, or created manually for ad-hoc repairs and inspections. Each work order is tracked from open to completion with a full cost record. ![Work orders list — code, subject, target, assignee, priority, status, and due date](/images/screenshots/fleet-ops/fleet-ops-maintenance-log.webp) diff --git a/content/docs/fleet-ops/navigator-app/build-and-release.mdx b/content/docs/fleet-ops/navigator-app/build-and-release.mdx index 1f51eba3..1c744359 100644 --- a/content/docs/fleet-ops/navigator-app/build-and-release.mdx +++ b/content/docs/fleet-ops/navigator-app/build-and-release.mdx @@ -4,8 +4,6 @@ sidebarTitle: Build & Release description: Build and ship your white-labeled Navigator app to the Apple App Store and Google Play — accounts, signing, Fastlane lanes, and the Google testing requirement. --- -# Build & Release - This page walks through the end-to-end publishing flow for a forked Navigator app: developer accounts, namespace, store profiles, code signing, build automation with Fastlane, and the constraints that gate each store. You should have already finished [Configuration](/docs/fleet-ops/navigator-app/configuration) — env vars and a working debug build on simulator — and [Theming & Branding](/docs/fleet-ops/navigator-app/theming) for your icon, splash, and colors. diff --git a/content/docs/fleet-ops/navigator-app/configuration.mdx b/content/docs/fleet-ops/navigator-app/configuration.mdx index d271a528..49472e64 100644 --- a/content/docs/fleet-ops/navigator-app/configuration.mdx +++ b/content/docs/fleet-ops/navigator-app/configuration.mdx @@ -4,8 +4,6 @@ sidebarTitle: Configuration description: Full env-var reference for the open-source Fleetbase Navigator app — Fleetbase connection, maps, driver UI, push notifications, geolocation, localization, and deep linking. --- -# Configuration - This guide is the full env-var reference for developers and operators who **fork, brand, and self-publish** the Fleetbase Navigator driver app. If your drivers will use the public Fleetbase Navigator app from the App Store / Google Play, see [Navigator App Setup](/docs/fleet-ops/getting-started/navigator-app-setup) instead — that page covers installing the public app and connecting it to your instance via the console-generated deep link. The Navigator source lives at [github.com/fleetbase/navigator-app](https://github.com/fleetbase/navigator-app). It's a React Native 0.77 app, Expo-free, with Tamagui for styling and Fastlane for release automation. diff --git a/content/docs/fleet-ops/navigator-app/quickstart.mdx b/content/docs/fleet-ops/navigator-app/quickstart.mdx index e002a478..af26b88d 100644 --- a/content/docs/fleet-ops/navigator-app/quickstart.mdx +++ b/content/docs/fleet-ops/navigator-app/quickstart.mdx @@ -3,8 +3,6 @@ title: Quickstart description: Clone the Navigator App, install dependencies, configure your Fleetbase keys, and run it in iOS, Android, or web. --- -# Navigator App Quickstart - Get the Navigator driver app running locally against your Fleetbase backend in about 15 minutes. ## Prerequisites diff --git a/content/docs/fleet-ops/navigator-app/theming.mdx b/content/docs/fleet-ops/navigator-app/theming.mdx index d4a98e93..4404cf79 100644 --- a/content/docs/fleet-ops/navigator-app/theming.mdx +++ b/content/docs/fleet-ops/navigator-app/theming.mdx @@ -3,8 +3,6 @@ title: Theming & Branding description: Customize colors, themes, app icon, splash screen, and display names for the Navigator App. --- -# Theming & Branding - The Navigator App uses [Tamagui](https://tamagui.dev) for theming. The setup combines a Tailwind-style color palette with named themes, plus runtime overrides via env vars for fast brand work without touching code. ## How Themes Work diff --git a/content/docs/fleet-ops/operations/orchestrator/overview.mdx b/content/docs/fleet-ops/operations/orchestrator/overview.mdx index 5c459bef..5a1ce66b 100644 --- a/content/docs/fleet-ops/operations/orchestrator/overview.mdx +++ b/content/docs/fleet-ops/operations/orchestrator/overview.mdx @@ -3,8 +3,6 @@ title: Orchestrator Overview description: A multi-phase planner that turns a pool of unassigned orders into a committable plan — stack vehicle allocation, driver allocation, and route optimization phases in sequence. --- -# Orchestrator Overview - The **Orchestrator** is the automated planner Fleet-Ops uses to turn a pool of unassigned orders into a committable assignment plan. Rather than running a single fixed pipeline, you compose **phases** in the Orchestrator Workbench and stack them in sequence — for example *Assign Vehicles → Optimize Routes → Assign Drivers*. Each phase runs one mode against the order pool using a configurable engine. The result is a proposed plan you can preview, adjust, and commit when ready. ![Orchestrator Workbench — multi-phase plan with three phases stacked: Assign Vehicles → Optimize Routes → Assign Vehicles](/images/screenshots/fleet-ops/orchestrator-multiple-phases.webp) diff --git a/content/docs/fleet-ops/operations/orchestrator/payload-capacity-allocation.mdx b/content/docs/fleet-ops/operations/orchestrator/payload-capacity-allocation.mdx index e486024a..2532afce 100644 --- a/content/docs/fleet-ops/operations/orchestrator/payload-capacity-allocation.mdx +++ b/content/docs/fleet-ops/operations/orchestrator/payload-capacity-allocation.mdx @@ -3,8 +3,6 @@ title: Payload & Capacity Allocation description: How the Orchestrator uses payload weight, volume, and entity data to enforce vehicle capacity constraints during assignment. --- -# Payload & Capacity Allocation - The Orchestrator uses **payload capacity** constraints to ensure that orders are assigned only to vehicles with sufficient load capacity. This prevents over-loading vehicles and ensures deliveries are physically feasible. ## How Capacity Allocation Works diff --git a/content/docs/fleet-ops/operations/orchestrator/vehicle-allocation.mdx b/content/docs/fleet-ops/operations/orchestrator/vehicle-allocation.mdx index 6e51c051..8f62c5e0 100644 --- a/content/docs/fleet-ops/operations/orchestrator/vehicle-allocation.mdx +++ b/content/docs/fleet-ops/operations/orchestrator/vehicle-allocation.mdx @@ -3,8 +3,6 @@ title: Vehicle Allocation description: How the Orchestrator matches vehicles to orders — availability, location proximity, and driver assignment. --- -# Vehicle Allocation - Vehicle allocation is what happens during a phase running in `assign_vehicles` mode (or the legacy `allocate` mode) in the Orchestrator. The active engine — `greedy`, `vroom`, or any extension-registered engine — evaluates each available vehicle against the orders in the pool and produces a vehicle-to-order assignment as part of the phase's output. ## How Vehicle Allocation Works diff --git a/content/docs/fleet-ops/operations/orchestrator/workbench.mdx b/content/docs/fleet-ops/operations/orchestrator/workbench.mdx index ee51dccd..9554b5bb 100644 --- a/content/docs/fleet-ops/operations/orchestrator/workbench.mdx +++ b/content/docs/fleet-ops/operations/orchestrator/workbench.mdx @@ -3,8 +3,6 @@ title: Workbench description: Compose phases, run the Orchestrator, review the proposed plan, and commit assignments — all from the Orchestrator Workbench. --- -# Orchestrator Workbench - The **Workbench** is the main UI for running the Orchestrator. It lays out the unassigned order pool, the available drivers and vehicles, and a phase builder where you compose and run optimization phases. The Workbench is a planning surface — nothing changes in production until you click **Commit**. ![Orchestrator Workbench — phase builder with order pool, map, and resource panel](/images/screenshots/fleet-ops/fleet-ops-orchestrator-2.webp) diff --git a/content/docs/fleet-ops/operations/order-configurations/activity-flows.mdx b/content/docs/fleet-ops/operations/order-configurations/activity-flows.mdx index c2615910..b00f0fae 100644 --- a/content/docs/fleet-ops/operations/order-configurations/activity-flows.mdx +++ b/content/docs/fleet-ops/operations/order-configurations/activity-flows.mdx @@ -3,8 +3,6 @@ title: Activity Flows description: Define the activity workflow that runs inside an order's started phase — transitions, logic, events, completion flag, and per-activity POD. --- -# Activity Flows - An **Activity Flow** is the workflow defined on an Order Configuration. It describes the activities a driver moves through while the order is in the `started` system status — and which activity ends the order. Each Order Configuration has exactly one flow, stored as a JSON graph of activities keyed by their `code`. ![Activity flow editor — graph of activities with transitions, logic, events, and completion flag](/images/screenshots/fleet-ops/fleet-ops-order-config-activity-flow.webp) diff --git a/content/docs/fleet-ops/operations/order-configurations/order-types.mdx b/content/docs/fleet-ops/operations/order-configurations/order-types.mdx index 202c6791..95dfc84f 100644 --- a/content/docs/fleet-ops/operations/order-configurations/order-types.mdx +++ b/content/docs/fleet-ops/operations/order-configurations/order-types.mdx @@ -3,8 +3,6 @@ title: Order Types description: Create and manage custom order types — define entity fields, constraints, and service categories per order configuration. --- -# Order Types - **Order Types** refer to the different categories of orders your operation handles, each backed by an **Order Configuration**. An order type determines what data is collected on each delivery, what fields appear on each item, and how drivers execute the workflow. ## What Defines an Order Type diff --git a/content/docs/fleet-ops/operations/order-configurations/overview.mdx b/content/docs/fleet-ops/operations/order-configurations/overview.mdx index 98a74489..8e0b9ecf 100644 --- a/content/docs/fleet-ops/operations/order-configurations/overview.mdx +++ b/content/docs/fleet-ops/operations/order-configurations/overview.mdx @@ -3,8 +3,6 @@ title: Order Configurations description: Order configurations define custom order types with their own workflows, entity fields, POD methods, and activity steps. --- -# Order Configurations - An **Order Configuration** (Order Config) is a template that defines how a particular type of order works in Fleet-Ops. Every order you create must be based on an Order Config — it determines the order's lifecycle, the data fields collected on each item, and what proof of delivery is required. This lets you run different service types from the same Fleet-Ops instance. A courier might have one config for same-day parcels (signature required), another for document delivery (photo required), and a third for returns (no POD needed). Each config has its own workflow and fields. diff --git a/content/docs/fleet-ops/operations/orders/importing-orders.mdx b/content/docs/fleet-ops/operations/orders/importing-orders.mdx index 9dab7785..0b5aec86 100644 --- a/content/docs/fleet-ops/operations/orders/importing-orders.mdx +++ b/content/docs/fleet-ops/operations/orders/importing-orders.mdx @@ -4,8 +4,6 @@ sidebarTitle: Importing description: Import many orders at once from a spreadsheet — including multi-waypoint and multi-entity orders — using the Order Import wizard. --- -# Importing Orders - For high-volume operations it isn't practical to create orders one-by-one in the console. Fleet-Ops includes an **Order Import** wizard that ingests `.xlsx` or `.csv` spreadsheets and creates orders, waypoints, entities, customers, and drivers in a single pass. This page walks through the import flow, the spreadsheet shape, and the row-grouping rules that drive multi-stop and multi-item orders. ![Orders Import — file upload modal with drag-and-drop area, accepted file types, and queued files list](/images/screenshots/fleet-ops/fleet-ops-orders-import.webp) diff --git a/content/docs/fleet-ops/operations/orders/kanban-board.mdx b/content/docs/fleet-ops/operations/orders/kanban-board.mdx index 1f2a09a8..f5ea6a45 100644 --- a/content/docs/fleet-ops/operations/orders/kanban-board.mdx +++ b/content/docs/fleet-ops/operations/orders/kanban-board.mdx @@ -3,8 +3,6 @@ title: Kanban Board description: Manage orders visually by status column — see all active orders at a glance, drag to reassign, and filter by driver or fleet. --- -# Kanban Board - The Kanban Board provides a visual, column-based view of all orders organized by **system status**. Each column represents one of the five system statuses — *created*, *dispatched*, *started*, *completed*, *canceled* — and each card represents an order. It gives dispatchers a real-time snapshot of the operation's current state without navigating individual order records. ![Fleet-Ops Kanban board — columns for each order status, order cards with driver and address info](/images/screenshots/fleet-ops/fleet-ops-orders-kanban.webp) diff --git a/content/docs/fleet-ops/operations/orders/managing-orders.mdx b/content/docs/fleet-ops/operations/orders/managing-orders.mdx index fc0fb819..2527b680 100644 --- a/content/docs/fleet-ops/operations/orders/managing-orders.mdx +++ b/content/docs/fleet-ops/operations/orders/managing-orders.mdx @@ -3,8 +3,6 @@ title: Managing Orders description: Create, edit, assign, dispatch, and manage orders from the Fleet-Ops orders list and detail views. --- -# Managing Orders - This page covers the day-to-day operations for managing orders in the Fleet-Ops console — creating new orders, assigning drivers, dispatching, and handling exceptions. ## Creating an Order diff --git a/content/docs/fleet-ops/operations/orders/order-lifecycle.mdx b/content/docs/fleet-ops/operations/orders/order-lifecycle.mdx index 6c85d7f2..5f967815 100644 --- a/content/docs/fleet-ops/operations/orders/order-lifecycle.mdx +++ b/content/docs/fleet-ops/operations/orders/order-lifecycle.mdx @@ -3,8 +3,6 @@ title: Order Lifecycle description: Understand the system statuses every order moves through, how the activity flow runs inside the started phase, and how an order is completed. --- -# Order Lifecycle - Every order in Fleet-Ops moves through a small set of **system statuses** that drive dispatch, billing, reporting, and webhook events. Inside those statuses — particularly between `started` and the order's completion — the **activity flow** defined on the Order Configuration runs the detailed steps the driver moves through. The system-status backbone is the same for every order; the activity flow is what makes one order type different from another. ## System Statuses diff --git a/content/docs/fleet-ops/operations/orders/overview.mdx b/content/docs/fleet-ops/operations/orders/overview.mdx index d7ccbb4a..ae0d29de 100644 --- a/content/docs/fleet-ops/operations/orders/overview.mdx +++ b/content/docs/fleet-ops/operations/orders/overview.mdx @@ -3,8 +3,6 @@ title: Orders Overview description: Learn how orders work in Fleet-Ops — creation, payload structure, assignment, dispatch, and completion. --- -# Orders Overview - An **Order** is the fundamental unit of work in Fleet-Ops. It represents a delivery task, a service job, or any dispatched activity your fleet needs to complete. Orders are created in the console (or via API), assigned to drivers, dispatched to the Navigator app, and completed with proof of delivery. ![Orders list — status filter tabs, search bar, order rows with status badges](/images/screenshots/fleet-ops/fleet-ops-orders-table-list.webp) diff --git a/content/docs/fleet-ops/operations/orders/proof-of-delivery.mdx b/content/docs/fleet-ops/operations/orders/proof-of-delivery.mdx index 116de4c7..326ad865 100644 --- a/content/docs/fleet-ops/operations/orders/proof-of-delivery.mdx +++ b/content/docs/fleet-ops/operations/orders/proof-of-delivery.mdx @@ -3,8 +3,6 @@ title: Proof of Delivery description: Configure and review proof of delivery — signatures, photos, QR scans, and custom data captured via the Navigator app. --- -# Proof of Delivery - **Proof of Delivery (POD)** is evidence captured by the driver at the point of delivery, confirming that an order — or a specific item or waypoint within an order — was successfully handed over. Fleet-Ops supports four POD methods, and POD is configured **per activity** in the Order Configuration's [activity flow](/docs/fleet-ops/operations/order-configurations/activity-flows). ## POD Methods diff --git a/content/docs/fleet-ops/operations/orders/scheduling-orders.mdx b/content/docs/fleet-ops/operations/orders/scheduling-orders.mdx index 3162a4b8..8c9a4e07 100644 --- a/content/docs/fleet-ops/operations/orders/scheduling-orders.mdx +++ b/content/docs/fleet-ops/operations/orders/scheduling-orders.mdx @@ -3,8 +3,6 @@ title: Scheduling Orders description: Schedule an order for a specific date and time — set pickup windows, time constraints, and future dispatch. --- -# Scheduling Orders - Orders can be scheduled for a specific future date and time rather than dispatched immediately. A scheduled order is still a normal order with system status `created` — the scheduling fields tell the Scheduler, the Orchestrator, and the dispatch queue *when* it's eligible to go out, but Fleet-Ops does not have a separate "scheduled" status. ## Setting a Scheduled Pickup diff --git a/content/docs/fleet-ops/operations/orders/tracking.mdx b/content/docs/fleet-ops/operations/orders/tracking.mdx index cbaf6ec0..01dc8e23 100644 --- a/content/docs/fleet-ops/operations/orders/tracking.mdx +++ b/content/docs/fleet-ops/operations/orders/tracking.mdx @@ -3,8 +3,6 @@ title: Tracking description: Track live order progress, driver position, and ETA from the order detail view and live map. --- -# Tracking - Fleet-Ops provides real-time tracking of order progress and driver location from the moment an order is dispatched until delivery is confirmed. Tracking is visible to operators in the console and optionally to customers via a public tracking link. ## Live Map diff --git a/content/docs/fleet-ops/operations/overview.mdx b/content/docs/fleet-ops/operations/overview.mdx index 8ba0c0e3..7d752529 100644 --- a/content/docs/fleet-ops/operations/overview.mdx +++ b/content/docs/fleet-ops/operations/overview.mdx @@ -3,8 +3,6 @@ title: Operations Overview description: An overview of Fleet-Ops operational capabilities — orders, dispatch, scheduling, and automation. --- -# Operations Overview - The Operations section of Fleet-Ops is the day-to-day control center for your logistics operation. It covers everything from creating and dispatching individual orders to running automated batch assignment across your entire fleet. ![Fleet-Ops operations panel — orders list with filter bar and live map](/images/screenshots/fleet-ops/fleet-ops-live-orders-panel.webp) diff --git a/content/docs/fleet-ops/operations/scheduler/driver-shift-schedules.mdx b/content/docs/fleet-ops/operations/scheduler/driver-shift-schedules.mdx index 742e7017..0d125bc6 100644 --- a/content/docs/fleet-ops/operations/scheduler/driver-shift-schedules.mdx +++ b/content/docs/fleet-ops/operations/scheduler/driver-shift-schedules.mdx @@ -3,8 +3,6 @@ title: Driver Shift Schedules description: Set up and manage recurring driver shift schedules — define working hours, days, breaks, and HOS compliance rules. --- -# Driver Shift Schedules - Driver shift schedules define when each driver is available to work. Shifts are used by the Orchestrator as time window constraints during order assignment, and they appear as blocks in the Scheduler calendar. ## What a Shift Schedule Defines diff --git a/content/docs/fleet-ops/operations/scheduler/order-scheduling.mdx b/content/docs/fleet-ops/operations/scheduler/order-scheduling.mdx index 0f78f437..cd465485 100644 --- a/content/docs/fleet-ops/operations/scheduler/order-scheduling.mdx +++ b/content/docs/fleet-ops/operations/scheduler/order-scheduling.mdx @@ -3,8 +3,6 @@ title: Order Scheduling description: Schedule orders onto driver timelines using the Scheduler — set pickup windows, assign to shifts, and manage scheduled order queues. --- -# Order Scheduling - Order scheduling lets you plan deliveries for future dates and assign them to specific driver shifts. Scheduled orders appear in the Scheduler calendar and are held in a waiting state until their scheduled window opens. ## Scheduling an Order diff --git a/content/docs/fleet-ops/operations/scheduler/overview.mdx b/content/docs/fleet-ops/operations/scheduler/overview.mdx index 4423fb0b..f94e558b 100644 --- a/content/docs/fleet-ops/operations/scheduler/overview.mdx +++ b/content/docs/fleet-ops/operations/scheduler/overview.mdx @@ -3,8 +3,6 @@ title: Scheduler Overview description: The Scheduler provides a fleet-wide calendar view of driver shifts, order assignments, and availability windows. --- -# Scheduler Overview - The **Scheduler** is a calendar-based planning tool that gives operators a fleet-wide view of driver shifts, scheduled orders, and availability windows. Use it to plan which drivers are working on which days, visualize how orders are distributed across your fleet, and manage shift patterns. ![Scheduler — weekly calendar grid with driver rows, shift blocks, and scheduled order cards](/images/screenshots/fleet-ops/fleet-ops-scheduler.webp) diff --git a/content/docs/fleet-ops/operations/service-areas-geofences/geofences.mdx b/content/docs/fleet-ops/operations/service-areas-geofences/geofences.mdx index 98a8ac38..e9071226 100644 --- a/content/docs/fleet-ops/operations/service-areas-geofences/geofences.mdx +++ b/content/docs/fleet-ops/operations/service-areas-geofences/geofences.mdx @@ -3,8 +3,6 @@ title: Geofences description: How service areas and zones become live geofences — entry, exit, dwell, and speed-limit events, the detection engine, and the reports that surface them. --- -# Geofences - A **geofence** in Fleet-Ops is any [Service Area](/docs/fleet-ops/operations/service-areas-geofences/service-areas) or [Zone](/docs/fleet-ops/operations/service-areas-geofences/zones) that has at least one trigger enabled. Geofences detect when a driver or vehicle crosses a boundary and emit events that downstream features react to: auto-arrival, dwell-time SLAs, restricted-area alerts, and speed-limit reporting. Geofences are **not a separate object** in Fleet-Ops — they're the operational behavior of service areas and zones. Toggle the trigger fields and you have a geofence; clear them and the same polygon still defines pricing scope but doesn't emit events. @@ -106,7 +104,7 @@ Geofence configuration follows standard Fleet-Ops role-based access: - **Manage service areas / zones** to edit trigger fields (typically operations admin role). - **View geofence events** to access the events and violations reports. -See [Identity & Access](/docs/identity-access/overview) for how to assign these permissions. +See [Identity & Access](/docs/platform/identity-and-access/roles-and-permissions) for how to assign these permissions. ## See Also diff --git a/content/docs/fleet-ops/operations/service-areas-geofences/service-areas.mdx b/content/docs/fleet-ops/operations/service-areas-geofences/service-areas.mdx index b1d4aeea..f30f01e1 100644 --- a/content/docs/fleet-ops/operations/service-areas-geofences/service-areas.mdx +++ b/content/docs/fleet-ops/operations/service-areas-geofences/service-areas.mdx @@ -3,8 +3,6 @@ title: Service Areas description: Define top-level geographic boundaries (typically country or region scale) that contain zones and drive geofence behavior in Fleet-Ops. --- -# Service Areas - A **Service Area** is a top-level geographic boundary that defines where your operation runs. Service areas are stored as MultiPolygons — they can be a country outline, a metropolitan region, a delivery footprint, or any other named area — and they act as containers for one or more nested [Zones](/docs/fleet-ops/operations/service-areas-geofences/zones). Service areas are the foundation for: diff --git a/content/docs/fleet-ops/operations/service-areas-geofences/zones.mdx b/content/docs/fleet-ops/operations/service-areas-geofences/zones.mdx index 1ba3782d..2026655d 100644 --- a/content/docs/fleet-ops/operations/service-areas-geofences/zones.mdx +++ b/content/docs/fleet-ops/operations/service-areas-geofences/zones.mdx @@ -3,8 +3,6 @@ title: Zones description: Nest precise operational boundaries inside a service area for finer dispatch, pricing, and geofencing. --- -# Zones - A **Zone** is a Polygon nested inside a single [Service Area](/docs/fleet-ops/operations/service-areas-geofences/service-areas). Zones subdivide a service area into finer-grained operational boundaries — delivery rings around a depot, exclusion zones inside a city, pickup territories assigned to specific drivers — and they participate in geofencing and pricing exactly like service areas. ## When to Use a Zone vs a Service Area diff --git a/content/docs/fleet-ops/operations/service-quotes/overview.mdx b/content/docs/fleet-ops/operations/service-quotes/overview.mdx index eacdaf2e..5e35ea52 100644 --- a/content/docs/fleet-ops/operations/service-quotes/overview.mdx +++ b/content/docs/fleet-ops/operations/service-quotes/overview.mdx @@ -3,8 +3,6 @@ title: Service Quotes description: Generate and manage service quotes for orders — how quotes are calculated, presented, and linked to transactions. --- -# Service Quotes - A **Service Quote** is a price estimate generated for an order based on matching Service Rates. Quotes are generated when an order's origin, destination, type, and payload details match a configured rate. They can be presented to customers before confirming an order, and accepted quotes become linked transactions. ![Service quotes list — quote ID, order reference, amount, currency, and expiry](/images/screenshots/fleet-ops/fleet-ops-service-quotes.webp) diff --git a/content/docs/fleet-ops/operations/service-rates/algorithm-rates.mdx b/content/docs/fleet-ops/operations/service-rates/algorithm-rates.mdx index f5e5b4a5..ed0335bd 100644 --- a/content/docs/fleet-ops/operations/service-rates/algorithm-rates.mdx +++ b/content/docs/fleet-ops/operations/service-rates/algorithm-rates.mdx @@ -4,8 +4,6 @@ sidebarTitle: Algorithm Rates description: Use a math expression to compute service rates dynamically — combine distance, time, stops, parcels, and other variables into a single formula evaluated at quote time. --- -# Algorithm-Based Service Rates - When `rate_calculation_method` is set to **`algo`** (or `algorithm`), the rate is computed by evaluating a math expression you supply. This unlocks pricing models that fixed brackets or per-meter rates can't express — for example "$3 base + $1.20/km, capped at $50" or "$0.05 per parcel-meter, plus $2 per extra stop". The expression is stored on the rate's `algorithm` field as a string. At quote time, Fleet-Ops substitutes the live values for placeholders like `{distance_km}` and `{stops}`, evaluates the math, and uses the result as the service fee. diff --git a/content/docs/fleet-ops/operations/service-rates/fixed-rate.mdx b/content/docs/fleet-ops/operations/service-rates/fixed-rate.mdx index 113d52f6..efa8b5a3 100644 --- a/content/docs/fleet-ops/operations/service-rates/fixed-rate.mdx +++ b/content/docs/fleet-ops/operations/service-rates/fixed-rate.mdx @@ -4,8 +4,6 @@ sidebarTitle: Fixed Rate description: Charge a flat fee per distance band — define the maximum distance you serve and Fleet-Ops generates one fee tier per unit, so you can price 0–1, 1–2, 2–3 km independently. --- -# Fixed Rate - **Fixed Rate** prices an order from a table of **distance bands** — each band covers a 1-unit slice of distance and has its own flat fee. The band the order's distance falls into determines the service fee. (In the API this method is identified as `fixed_meter`; the legacy value `fixed_rate` also works.) Use this when your pricing is **banded by distance** but doesn't scale linearly — for example "any delivery under 5 km is $5, anything under 10 km is $8, anything further is $12". The bands are whole-unit distance steps capped at the maximum distance you set. diff --git a/content/docs/fleet-ops/operations/service-rates/multi-zone-distance.mdx b/content/docs/fleet-ops/operations/service-rates/multi-zone-distance.mdx index 94fd6ea1..3cef6cfd 100644 --- a/content/docs/fleet-ops/operations/service-rates/multi-zone-distance.mdx +++ b/content/docs/fleet-ops/operations/service-rates/multi-zone-distance.mdx @@ -4,8 +4,6 @@ sidebarTitle: Multi-zone Distance description: Charge different per-distance rates in different geographies — define a rate per zone or service area, set a fallback for unmatched segments, and Fleet-Ops splits the route across them at quote time. --- -# Multi-zone Distance - **Multi-zone Distance** splits the route's distance across **geographic rules** — each rule covers a Zone or Service Area and has its own per-distance rate. The portion of the route inside each rule's geography is priced with that rule's rate; an optional **fallback rule** picks up any distance that falls outside every defined geography. (In the API this method is identified as `multi_zone_distance`.) This unlocks pricing models like: diff --git a/content/docs/fleet-ops/operations/service-rates/overview.mdx b/content/docs/fleet-ops/operations/service-rates/overview.mdx index 1d2cb399..b1007924 100644 --- a/content/docs/fleet-ops/operations/service-rates/overview.mdx +++ b/content/docs/fleet-ops/operations/service-rates/overview.mdx @@ -3,8 +3,6 @@ title: Service Rates description: Define pricing rules and rate structures used to calculate order costs — flat fees, distance-based, weight-based, zone pricing, and surcharges. --- -# Service Rates - **Service Rates** define the pricing rules Fleet-Ops uses to calculate the cost of an order. Rates can be flat fees, distance-based, weight-based, or zone-based. They support surcharges for COD (cash on delivery), peak hours, and parcel size. When an order matches a service rate, Fleet-Ops generates a **Service Quote** with the calculated amount. ![Service rates list — rate name, service type, base fee, and scope columns](/images/screenshots/fleet-ops/fleet-ops-service-rate-list.webp) diff --git a/content/docs/fleet-ops/operations/service-rates/parcel.mdx b/content/docs/fleet-ops/operations/service-rates/parcel.mdx index 22dd3f6e..cf7c56bf 100644 --- a/content/docs/fleet-ops/operations/service-rates/parcel.mdx +++ b/content/docs/fleet-ops/operations/service-rates/parcel.mdx @@ -4,8 +4,6 @@ sidebarTitle: Parcel Rate description: Charge per parcel based on its size and weight — define tier thresholds (small, medium, large, x-large), and Fleet-Ops sums the right fee for every parcel in the order. --- -# Parcel Rate - **Parcel Rate** scales the service fee with the **number and physical characteristics of the parcels** in the order. You define a tier table by size category — each tier has length, width, height, and weight thresholds, plus a fee — and every parcel on the order is matched against the table and charged the matching tier's fee. (In the API this method is identified as `parcel`.) Use this for parcel and e-commerce delivery where pricing depends on physical attributes, not route distance. If you want to combine parcel pricing with distance, use [Algorithm](/docs/fleet-ops/operations/service-rates/algorithm-rates) with `{parcels}`, or place a parcel rate alongside a distance rate on different services. diff --git a/content/docs/fleet-ops/operations/service-rates/per-drop.mdx b/content/docs/fleet-ops/operations/service-rates/per-drop.mdx index 93da53d4..6df13a21 100644 --- a/content/docs/fleet-ops/operations/service-rates/per-drop.mdx +++ b/content/docs/fleet-ops/operations/service-rates/per-drop.mdx @@ -4,8 +4,6 @@ sidebarTitle: Per Drop-off description: Price an order by the number of stops on the route. Define min/max ranges and a flat fee for each band — ideal for multi-stop courier and batch deliveries. --- -# Per Drop-off - **Per Drop-off** sets the service fee by the **number of stops** on the order. You define a tier table — each tier is a range of stop counts with a flat fee — and the tier the order's stop count falls into is charged. (In the API this method is identified as `per_drop`.) Use this for multi-stop courier work, batch deliveries, and any pricing model where each additional stop is what really drives cost. If you want distance-based pricing on top, layer this against an [Algorithm](/docs/fleet-ops/operations/service-rates/algorithm-rates) rate instead. diff --git a/content/docs/fleet-ops/operations/service-rates/per-meter.mdx b/content/docs/fleet-ops/operations/service-rates/per-meter.mdx index c427d8a0..8ef87247 100644 --- a/content/docs/fleet-ops/operations/service-rates/per-meter.mdx +++ b/content/docs/fleet-ops/operations/service-rates/per-meter.mdx @@ -4,8 +4,6 @@ sidebarTitle: Per Meter description: Charge a flat rate per unit of distance — meters, kilometers, feet, yards, or miles. The simplest linear distance-based pricing model. --- -# Per Meter - **Per Meter** scales the service fee **linearly with distance**. You set a fee per unit of distance (e.g. $0.80 per km), pick the unit, and Fleet-Ops multiplies it by the actual route distance at quote time. (In the API this method is identified as `per_meter`.) Use this for taxi-style or urban-delivery pricing where every additional unit of distance adds a predictable, constant amount. If your pricing curve changes at certain distances, use [Fixed Rate](/docs/fleet-ops/operations/service-rates/fixed-rate) instead; if it needs to vary by region, use [Multi-zone Distance](/docs/fleet-ops/operations/service-rates/multi-zone-distance). diff --git a/content/docs/fleet-ops/recipes/fuel-provider-integrations.mdx b/content/docs/fleet-ops/recipes/fuel-provider-integrations.mdx index f51b6b5a..6d8084c8 100644 --- a/content/docs/fleet-ops/recipes/fuel-provider-integrations.mdx +++ b/content/docs/fleet-ops/recipes/fuel-provider-integrations.mdx @@ -4,8 +4,6 @@ sidebarTitle: Fuel Integrations description: Register custom fuel card and fuel management integrations in Fleet-Ops without modifying Fleet-Ops core. --- -# Fuel Integrations - Fleet-Ops fuel integrations connect external fuel card providers, station networks, onsite fuel management systems, and billing APIs to Fleet-Ops. PetroApp ships as the native example integration, and extensions can register additional providers through the same framework. Fuel integrations are split into three records: diff --git a/content/docs/fleet-ops/resources/contacts/overview.mdx b/content/docs/fleet-ops/resources/contacts/overview.mdx index 242006e5..ff6aa8b6 100644 --- a/content/docs/fleet-ops/resources/contacts/overview.mdx +++ b/content/docs/fleet-ops/resources/contacts/overview.mdx @@ -3,8 +3,6 @@ title: Contacts description: Manage the people and businesses your operation works with — customers, suppliers, and facilitators — with linked locations and custom fields. --- -# Contacts - **Contacts** are the people and businesses your logistics operation interacts with. They serve as customers who receive deliveries, suppliers who provide pickups, and facilitators who coordinate operations. Contacts are linked to Places (their physical location) and can be assigned to orders in the customer or facilitator role. ![Contacts list — name, type badge, email, phone, and linked location](/images/screenshots/fleet-ops/fleet-ops-contacts-list.webp) diff --git a/content/docs/fleet-ops/resources/drivers/navigator-access.mdx b/content/docs/fleet-ops/resources/drivers/navigator-access.mdx index e70bfc8b..8ef0772c 100644 --- a/content/docs/fleet-ops/resources/drivers/navigator-access.mdx +++ b/content/docs/fleet-ops/resources/drivers/navigator-access.mdx @@ -3,8 +3,6 @@ title: Navigator Access description: Manage a driver's access to the Navigator app — login, device registration, permissions, and auth token management. --- -# Navigator Access - **Navigator Access** covers how drivers authenticate into the Navigator app, how their device is registered, and how you manage their app access from the console. ## How Drivers Log In diff --git a/content/docs/fleet-ops/resources/drivers/overview.mdx b/content/docs/fleet-ops/resources/drivers/overview.mdx index 76d7a3f8..defdd9c7 100644 --- a/content/docs/fleet-ops/resources/drivers/overview.mdx +++ b/content/docs/fleet-ops/resources/drivers/overview.mdx @@ -3,8 +3,6 @@ title: Drivers description: Create and manage driver profiles — assign vehicles, track real-time location, configure Navigator access, and set Orchestrator constraints. --- -# Drivers - **Drivers** are the people who execute orders using the Navigator mobile app. Each driver record links to a Fleetbase user account and stores all the information needed for dispatch, real-time tracking, and Orchestrator assignment. ![Drivers list — name, status badge, current vehicle, online indicator](/images/screenshots/fleet-ops/fleet-ops-drivers-list.webp) diff --git a/content/docs/fleet-ops/resources/drivers/shift-schedules.mdx b/content/docs/fleet-ops/resources/drivers/shift-schedules.mdx index b5b4bd7c..fcc33aeb 100644 --- a/content/docs/fleet-ops/resources/drivers/shift-schedules.mdx +++ b/content/docs/fleet-ops/resources/drivers/shift-schedules.mdx @@ -3,8 +3,6 @@ title: Shift Schedules description: View and manage an individual driver's shift schedule — set working hours, recurring patterns, and availability windows. --- -# Driver Shift Schedules - Each driver can have a **shift schedule** that defines when they are available to work. Shift schedules appear in the Scheduler calendar and are used by the Orchestrator as time window constraints during order assignment. ## Viewing a Driver's Schedule diff --git a/content/docs/fleet-ops/resources/fleets/overview.mdx b/content/docs/fleet-ops/resources/fleets/overview.mdx index af60b501..73bfc756 100644 --- a/content/docs/fleet-ops/resources/fleets/overview.mdx +++ b/content/docs/fleet-ops/resources/fleets/overview.mdx @@ -3,8 +3,6 @@ title: Fleets description: Organize drivers and vehicles into named fleets — group by zone, service type, or shift for structured dispatch and Orchestrator scoping. --- -# Fleets - A **Fleet** is a logical grouping of drivers and vehicles. Fleets let you organize your operation by route, service area, service type, shift time, or any other dimension that makes sense for your business. The Orchestrator uses fleet membership to scope which drivers and vehicles are considered when allocating orders. ![Fleets list — fleet name, color indicator, driver count, vehicle count, and status badges](/images/screenshots/fleet-ops/fleet-ops-fleets-list.webp) diff --git a/content/docs/fleet-ops/resources/fuel-reports/overview.mdx b/content/docs/fleet-ops/resources/fuel-reports/overview.mdx index d1dc4f1d..8beb03c3 100644 --- a/content/docs/fleet-ops/resources/fuel-reports/overview.mdx +++ b/content/docs/fleet-ops/resources/fuel-reports/overview.mdx @@ -3,8 +3,6 @@ title: Fuel Reports description: Record and monitor fleet fuel consumption — track volume, cost, odometer readings, and fuel-up locations for cost analysis and fraud detection. --- -# Fuel Reports - **Fuel Reports** are records of fleet fuel consumption. Drivers submit reports when they fill up, and operators can log reports from the console. Each report captures the volume, cost, odometer reading, and location of the fuel transaction. Fuel reports are used for cost tracking, consumption analysis, and detecting anomalies. ![Fuel reports list — driver, vehicle, date, volume, amount, and status badge](/images/screenshots/fleet-ops/fleet-ops-fuel-reports-list.webp) diff --git a/content/docs/fleet-ops/resources/issues/overview.mdx b/content/docs/fleet-ops/resources/issues/overview.mdx index f7525672..d6c5a608 100644 --- a/content/docs/fleet-ops/resources/issues/overview.mdx +++ b/content/docs/fleet-ops/resources/issues/overview.mdx @@ -3,8 +3,6 @@ title: Issues description: Log, track, and resolve operational issues — vehicle faults, driver incidents, accidents, and delivery exceptions — with priority and status tracking. --- -# Issues - **Issues** are operational incidents, faults, and exceptions that need to be tracked and resolved. Drivers can report issues from the Navigator app, and operators can log them from the console. Issues are linked to the driver, vehicle, or location involved and tracked through a resolution workflow. ![Issues list — issue title, category, priority badge, status, assigned to, and reported date](/images/screenshots/fleet-ops/fleet-ops-issues-list.webp) diff --git a/content/docs/fleet-ops/resources/overview.mdx b/content/docs/fleet-ops/resources/overview.mdx index 109f9502..c8cb6f57 100644 --- a/content/docs/fleet-ops/resources/overview.mdx +++ b/content/docs/fleet-ops/resources/overview.mdx @@ -3,8 +3,6 @@ title: Resources Overview description: Manage the core resources that power your fleet operations — drivers, vehicles, fleets, vendors, contacts, and places. --- -# Resources Overview - The **Resources** section of Fleet-Ops is where you manage the assets and entities your operations depend on. Resources are the building blocks the Orchestrator uses for assignment, the live map displays in real time, and the activity timeline references throughout an order's lifecycle. ## Resource Types diff --git a/content/docs/fleet-ops/resources/places/overview.mdx b/content/docs/fleet-ops/resources/places/overview.mdx index 821022a7..f21feb6f 100644 --- a/content/docs/fleet-ops/resources/places/overview.mdx +++ b/content/docs/fleet-ops/resources/places/overview.mdx @@ -3,8 +3,6 @@ title: Places description: Create and manage a library of saved locations — pickup points, warehouses, hubs, and delivery addresses used across orders. --- -# Places - **Places** are saved locations in Fleet-Ops — reusable addresses for pickup points, warehouses, distribution hubs, customer addresses, and any other location your operation regularly uses. When creating orders, you can select from your Places library instead of entering addresses each time. ![Places list — place name, type badge, address, and linked contact](/images/screenshots/fleet-ops/fleet-ops-places-list.webp) diff --git a/content/docs/fleet-ops/resources/vehicles/capacity-and-payload.mdx b/content/docs/fleet-ops/resources/vehicles/capacity-and-payload.mdx index 532127b0..e2676fdb 100644 --- a/content/docs/fleet-ops/resources/vehicles/capacity-and-payload.mdx +++ b/content/docs/fleet-ops/resources/vehicles/capacity-and-payload.mdx @@ -3,8 +3,6 @@ title: Capacity & Payload description: Configure vehicle load capacity — weight and volume limits used by the Orchestrator to prevent overloading during batch order assignment. --- -# Vehicle Capacity & Payload - Vehicle **capacity** settings define the maximum load a vehicle can carry. These values are used by the Orchestrator when allocating orders — it will not assign orders to a vehicle if doing so would exceed the vehicle's weight or volume capacity. ## Capacity Fields diff --git a/content/docs/fleet-ops/resources/vehicles/overview.mdx b/content/docs/fleet-ops/resources/vehicles/overview.mdx index 31d6ae95..e2626160 100644 --- a/content/docs/fleet-ops/resources/vehicles/overview.mdx +++ b/content/docs/fleet-ops/resources/vehicles/overview.mdx @@ -3,8 +3,6 @@ title: Vehicles description: Register and manage your vehicle fleet — details, assignments, capacity, tracking, and maintenance history. --- -# Vehicles - **Vehicles** are the fleet assets assigned to carry out orders. Each vehicle record stores physical details, capacity specifications, real-time location, and links to the driver, maintenance schedules, and connected devices (GPS, OBD-II, cameras, sensors). ![Vehicle position playback — a vehicle's recent route on the live map with timeline scrubber](/images/screenshots/fleet-ops/fleet-ops-vehicle-position-playback.webp) diff --git a/content/docs/fleet-ops/resources/vehicles/tracking.mdx b/content/docs/fleet-ops/resources/vehicles/tracking.mdx index 0e494849..ee526f9b 100644 --- a/content/docs/fleet-ops/resources/vehicles/tracking.mdx +++ b/content/docs/fleet-ops/resources/vehicles/tracking.mdx @@ -3,8 +3,6 @@ title: Vehicle Tracking description: Monitor real-time vehicle position, view trip history, and replay historical routes from the vehicle detail panel. --- -# Vehicle Tracking - Fleet-Ops tracks vehicle position in real time and stores a complete position history for every vehicle. Position data comes from two sources: the **Navigator app** (driver's phone GPS) and **telematics devices** (GPS modems installed in the vehicle). ## Real-Time Position diff --git a/content/docs/fleet-ops/resources/vendors/integrated-vendors.mdx b/content/docs/fleet-ops/resources/vendors/integrated-vendors.mdx index b2a118e1..3aaa8ffb 100644 --- a/content/docs/fleet-ops/resources/vendors/integrated-vendors.mdx +++ b/content/docs/fleet-ops/resources/vendors/integrated-vendors.mdx @@ -4,8 +4,6 @@ sidebarTitle: Integrated Vendors description: Connect external logistics platforms (Lalamove and others) using the Integrated Vendor framework, and learn how to register your own provider. --- -# Integrated Vendors - An **Integrated Vendor** is an external logistics platform — Lalamove, a courier network, a freight aggregator — that Fleet-Ops talks to via its API. When you assign an order to an integrated vendor, Fleet-Ops relays the order to the partner's platform, the partner dispatches their own driver, and status updates stream back via webhooks while the order's lifecycle continues to live inside Fleet-Ops. This page covers configuring an integrated vendor in the console and the **framework** Fleet-Ops uses internally to add new providers — so you can wire up your own. diff --git a/content/docs/fleet-ops/resources/vendors/overview.mdx b/content/docs/fleet-ops/resources/vendors/overview.mdx index aa8796f8..4fef4b71 100644 --- a/content/docs/fleet-ops/resources/vendors/overview.mdx +++ b/content/docs/fleet-ops/resources/vendors/overview.mdx @@ -3,8 +3,6 @@ title: Vendors description: Manage third-party carriers and service providers — assign drivers, configure integrations, and relay orders to partner logistics platforms. --- -# Vendors - **Vendors** are third-party carriers or service providers in your logistics network. Unlike internal drivers and vehicles, a vendor represents an external company that provides their own drivers and fleet. Orders can be assigned to a vendor, who then dispatches using their own resources. ![Vendors list — vendor name, type, driver count, status badge, and integration indicator](/images/screenshots/fleet-ops/fleet-ops-vendors-list.webp) diff --git a/content/docs/fleet-ops/settings/avatars.mdx b/content/docs/fleet-ops/settings/avatars.mdx index f3104287..d4817dd2 100644 --- a/content/docs/fleet-ops/settings/avatars.mdx +++ b/content/docs/fleet-ops/settings/avatars.mdx @@ -4,8 +4,6 @@ sidebarTitle: Avatars description: Manage the avatar image library used for vehicles, places, and drivers across the Fleet-Ops console and live map. --- -# Avatar Settings - **Avatars** are the icons and images Fleet-Ops uses to identify vehicles, places, and drivers in the console and on the live map. The Avatar Manager is a centralised library of those images organised by **category** — so when you assign an avatar on a driver, vehicle, or place record, you pick from the correct category's library rather than re-uploading per resource. Navigate to **Fleet-Ops → Settings → Avatars**. diff --git a/content/docs/fleet-ops/settings/custom-fields.mdx b/content/docs/fleet-ops/settings/custom-fields.mdx index de360a74..fd9d7353 100644 --- a/content/docs/fleet-ops/settings/custom-fields.mdx +++ b/content/docs/fleet-ops/settings/custom-fields.mdx @@ -4,8 +4,6 @@ sidebarTitle: Custom Fields description: Define additional structured fields for any Fleet-Ops resource — drivers, vehicles, contacts, vendors, places, entities, fleets, issues, and fuel reports. --- -# Custom Field Settings - **Custom Fields** let you attach additional structured data to Fleet-Ops resources without building an extension. Fields are defined in the Custom Fields Manager and rendered inline on the corresponding resource detail view. Navigate to **Fleet-Ops → Settings → Custom Fields**. diff --git a/content/docs/fleet-ops/settings/map.mdx b/content/docs/fleet-ops/settings/map.mdx index 8d191ea1..7e814d5f 100644 --- a/content/docs/fleet-ops/settings/map.mdx +++ b/content/docs/fleet-ops/settings/map.mdx @@ -4,8 +4,6 @@ sidebarTitle: Map description: Choose the map tile provider Fleet-Ops uses for the live map and route overlays. --- -# Map Settings - **Map Settings** are intentionally minimal in Fleet-Ops — the only thing you configure here is which **map provider** renders the tiles for the live map. Everything else (default viewport, marker behaviour, clustering, theme) is driven by the active provider's defaults and the page-level Leaflet options used by Fleet-Ops components. Navigate to **Fleet-Ops → Settings → Map**. diff --git a/content/docs/fleet-ops/settings/navigator-app.mdx b/content/docs/fleet-ops/settings/navigator-app.mdx index c202f40f..213a997d 100644 --- a/content/docs/fleet-ops/settings/navigator-app.mdx +++ b/content/docs/fleet-ops/settings/navigator-app.mdx @@ -4,8 +4,6 @@ sidebarTitle: Navigator App description: Configure Navigator app behaviour — entity-field editing per Order Configuration and driver self-onboarding from the app. --- -# Navigator App Settings - **Navigator App Settings** control two operation-specific behaviours of the Navigator driver mobile app: which entity fields drivers are allowed to edit per Order Configuration, and whether drivers can onboard themselves from the app. Navigate to **Fleet-Ops → Settings → Navigator App**. diff --git a/content/docs/fleet-ops/settings/notifications.mdx b/content/docs/fleet-ops/settings/notifications.mdx index 50ce0adb..26fd555e 100644 --- a/content/docs/fleet-ops/settings/notifications.mdx +++ b/content/docs/fleet-ops/settings/notifications.mdx @@ -4,8 +4,6 @@ sidebarTitle: Notifications description: Pick who receives each Fleet-Ops notification — drivers, customers, operators, vendors, or any registered notifiable. --- -# Notification Settings - **Notification Settings** answer one question per registered notification: *who should receive it?* For each notification that Fleet-Ops (or an installed extension) has registered with the platform, this page renders a single multi-select where you pick the **notifiables** — the parties who get the alert when that notification fires. Channels (SMS / email / push), message templates, and trigger conditions live elsewhere: diff --git a/content/docs/fleet-ops/settings/orchestrator.mdx b/content/docs/fleet-ops/settings/orchestrator.mdx index f302252a..5d2da788 100644 --- a/content/docs/fleet-ops/settings/orchestrator.mdx +++ b/content/docs/fleet-ops/settings/orchestrator.mdx @@ -4,8 +4,6 @@ sidebarTitle: Orchestrator description: Configure the default Orchestrator engine, automatic allocation triggers, global allocation constraints, and order card field display. --- -# Orchestrator Settings - **Orchestrator Settings** control the defaults for the [Orchestrator](/docs/fleet-ops/operations/orchestrator/overview) — which engine new phases use by default, whether new orders are allocated automatically, and the global constraints that apply across every Orchestrator run. Navigate to **Fleet-Ops → Settings → Orchestrator**. diff --git a/content/docs/fleet-ops/settings/payments.mdx b/content/docs/fleet-ops/settings/payments.mdx index d60d0ada..c0a44340 100644 --- a/content/docs/fleet-ops/settings/payments.mdx +++ b/content/docs/fleet-ops/settings/payments.mdx @@ -4,8 +4,6 @@ sidebarTitle: Payments description: Connect a Stripe Connect account so Fleet-Ops can charge customers for service quotes and surface settled transactions in the console. --- -# Payment Settings - **Payment Settings** in Fleet-Ops manages a single thing: connecting your organisation to Stripe via **Stripe Connect**. Once connected, Fleet-Ops can charge customers for service quotes, surface every settled transaction in the payments table, and aggregate totals by currency. There are no separate Stripe API key fields, currency selectors, or capture-mode toggles — the Stripe account itself owns those settings. Navigate to **Fleet-Ops → Settings → Payments**. diff --git a/content/docs/fleet-ops/settings/routing.mdx b/content/docs/fleet-ops/settings/routing.mdx index fb2a468d..6737831d 100644 --- a/content/docs/fleet-ops/settings/routing.mdx +++ b/content/docs/fleet-ops/settings/routing.mdx @@ -4,8 +4,6 @@ sidebarTitle: Routing description: Pick which routing service renders Fleet-Ops routes, which engine optimises stop order, and the distance unit used in the UI. --- -# Routing Settings - **Routing Settings** is a small page with three selections that drive how Fleet-Ops calculates and renders routes. Two of the three sit on opposite sides of an important distinction: | Concept | What it does | diff --git a/content/docs/fleet-ops/settings/scheduling.mdx b/content/docs/fleet-ops/settings/scheduling.mdx index fc56406b..c446421b 100644 --- a/content/docs/fleet-ops/settings/scheduling.mdx +++ b/content/docs/fleet-ops/settings/scheduling.mdx @@ -4,8 +4,6 @@ sidebarTitle: Scheduling description: Set the materialisation horizon, default shift duration, HOS limits, scheduling behaviours, and reusable schedule templates that drive the Scheduler and Orchestrator. --- -# Scheduling Settings - **Scheduling Settings** controls global defaults for the [Scheduler](/docs/fleet-ops/operations/scheduler/overview) — how far ahead shifts are materialised, default shift duration, Hours-of-Service (HOS) limits, behaviour toggles, and a library of reusable schedule templates. Navigate to **Fleet-Ops → Settings → Scheduling**. diff --git a/content/docs/ledger/accounting/chart-of-accounts.mdx b/content/docs/ledger/accounting/chart-of-accounts.mdx index b1dcb1ed..78d2542a 100644 --- a/content/docs/ledger/accounting/chart-of-accounts.mdx +++ b/content/docs/ledger/accounting/chart-of-accounts.mdx @@ -3,8 +3,6 @@ title: Chart of Accounts description: Define and manage your chart of accounts — the structured list of accounts used to record all financial transactions. --- -# Chart of Accounts - The **Chart of Accounts** is the structured list of all accounts used by your organization to record financial transactions. It is the foundation of your accounting system — every financial event is categorized into one of these accounts. Navigate to **Ledger → Accounting → Accounts**. diff --git a/content/docs/ledger/accounting/general-ledger.mdx b/content/docs/ledger/accounting/general-ledger.mdx index 524fa4a4..330e47ca 100644 --- a/content/docs/ledger/accounting/general-ledger.mdx +++ b/content/docs/ledger/accounting/general-ledger.mdx @@ -3,8 +3,6 @@ title: General Ledger description: View the master record of all journal entries — a complete chronological history of every financial transaction. --- -# General Ledger - The **General Ledger** is the master record of all journal entries across your organization. It provides a complete, chronological view of every financial event — debits, credits, amounts, and running balances. Navigate to **Ledger → Accounting → General Ledger**. diff --git a/content/docs/ledger/accounting/journal-entries.mdx b/content/docs/ledger/accounting/journal-entries.mdx index 1050aef6..f43ed61d 100644 --- a/content/docs/ledger/accounting/journal-entries.mdx +++ b/content/docs/ledger/accounting/journal-entries.mdx @@ -3,8 +3,6 @@ title: Journal Entries description: View automated journal entries and create manual entries for accounting adjustments and corrections. --- -# Journal Entries - A **Journal Entry** is the atomic record of a financial event. Most entries are written automatically by Ledger as the system processes invoice payments, gateway charges, wallet operations, and Storefront sales. You can also create manual entries for adjustments and corrections. Navigate to **Ledger → Accounting → Journal**. diff --git a/content/docs/ledger/accounting/overview.mdx b/content/docs/ledger/accounting/overview.mdx index 00112670..24a96ac8 100644 --- a/content/docs/ledger/accounting/overview.mdx +++ b/content/docs/ledger/accounting/overview.mdx @@ -3,8 +3,6 @@ title: Accounting description: Manage your chart of accounts, general ledger, and journal entries — the foundation of Ledger's double-entry bookkeeping system. --- -# Accounting - The **Accounting** module provides the double-entry bookkeeping foundation of Ledger. It manages the chart of accounts, records all financial activity as journal entries, and aggregates them in the general ledger. Navigate to **Ledger → Accounting** to access accounting features. diff --git a/content/docs/ledger/billing/invoice-templates.mdx b/content/docs/ledger/billing/invoice-templates.mdx index 8ae36913..284d6563 100644 --- a/content/docs/ledger/billing/invoice-templates.mdx +++ b/content/docs/ledger/billing/invoice-templates.mdx @@ -3,8 +3,6 @@ title: Invoice Templates description: Design reusable invoice templates with variable interpolation — invoice number, totals, customer details, and payment references. --- -# Invoice Templates - **Invoice Templates** control how invoices are rendered for PDF and the public online portal. Ledger's templates use Fleetbase's core `Template` model with the `invoice` context — they are HTML bodies with variable interpolation, edited via the **Template Builder** component. Navigate to **Ledger → Billing → Invoice Templates**. diff --git a/content/docs/ledger/billing/invoices.mdx b/content/docs/ledger/billing/invoices.mdx index 875597d6..4c4c1686 100644 --- a/content/docs/ledger/billing/invoices.mdx +++ b/content/docs/ledger/billing/invoices.mdx @@ -3,8 +3,6 @@ title: Invoices description: Create and manage invoices — line items, payments, public payment URL, PDF rendering, and Fleet-Ops integration. --- -# Invoices - An **Invoice** is a formal request for payment. It details the products or services provided, quantities, prices, and the total amount due. Invoices have a complete lifecycle from `draft` to `paid` with revenue recognition at each step. Navigate to **Ledger → Billing → Invoices**. diff --git a/content/docs/ledger/billing/overview.mdx b/content/docs/ledger/billing/overview.mdx index 2a670d93..edabc2d9 100644 --- a/content/docs/ledger/billing/overview.mdx +++ b/content/docs/ledger/billing/overview.mdx @@ -3,8 +3,6 @@ title: Billing & Invoicing description: Create, send, and collect payment on invoices — manually or automatically from Fleet-Ops orders. --- -# Billing & Invoicing - The **Billing** module handles invoice creation, delivery, and payment collection. Invoices are typed payment requests with a lifecycle from `draft` through `paid`. Customers pay invoices online via a public URL (no login required). Navigate to **Ledger → Billing** to access invoices and templates. diff --git a/content/docs/ledger/getting-started/core-concepts.mdx b/content/docs/ledger/getting-started/core-concepts.mdx index 14f61315..3fec1b19 100644 --- a/content/docs/ledger/getting-started/core-concepts.mdx +++ b/content/docs/ledger/getting-started/core-concepts.mdx @@ -3,8 +3,6 @@ title: Core Concepts description: The foundational concepts of Ledger — double-entry bookkeeping, accounts, journal entries, wallets, invoices, transactions, and how it all fits together. --- -# Core Concepts - Ledger implements proper double-entry bookkeeping. Understanding the core accounting model helps you use the system correctly and interpret your financial reports. ## The Accounting Equation diff --git a/content/docs/ledger/getting-started/quickstart.mdx b/content/docs/ledger/getting-started/quickstart.mdx index 90215683..c78dafb2 100644 --- a/content/docs/ledger/getting-started/quickstart.mdx +++ b/content/docs/ledger/getting-started/quickstart.mdx @@ -3,8 +3,6 @@ title: Quickstart description: Get up and running with Ledger — review your default chart of accounts, set invoicing defaults, configure a payment gateway, and create your first invoice. --- -# Quickstart - This guide walks you through reviewing your seeded chart of accounts, setting invoicing defaults, configuring a payment gateway, and creating and recording payment on your first invoice. ## Step 1 — Review Your Chart of Accounts diff --git a/content/docs/ledger/integrations/fleet-ops.mdx b/content/docs/ledger/integrations/fleet-ops.mdx index 1a26d600..14eca76b 100644 --- a/content/docs/ledger/integrations/fleet-ops.mdx +++ b/content/docs/ledger/integrations/fleet-ops.mdx @@ -3,8 +3,6 @@ title: Fleet-Ops Integration description: Ledger automatically creates draft invoices for Fleet-Ops orders so you don't have to bill each order by hand. --- -# Fleet-Ops Integration - Ledger and Fleet-Ops are wired together out of the box. The moment a Fleet-Ops order has its pricing locked in, Ledger automatically creates a **draft invoice** for that order and recognizes the revenue in your books. You don't need to copy line items by hand, type in customer details, or remember which orders haven't been invoiced yet — it all happens for you. diff --git a/content/docs/ledger/integrations/storefront.mdx b/content/docs/ledger/integrations/storefront.mdx index ba98b148..6e0b3b1a 100644 --- a/content/docs/ledger/integrations/storefront.mdx +++ b/content/docs/ledger/integrations/storefront.mdx @@ -3,8 +3,6 @@ title: Storefront Integration description: Storefront orders record the sale directly in your books — no invoice needed, because the customer has already paid at checkout. --- -# Storefront Integration - Storefront and Ledger work together a little differently than Fleet-Ops and Ledger. A Storefront order is a **point-of-sale** transaction — the customer pays at checkout, before the order is even created. There's nothing to bill them for after the fact. So instead of generating an invoice, Ledger records the sale **directly in your books** the moment the order completes. diff --git a/content/docs/ledger/payments/gateways/cash.mdx b/content/docs/ledger/payments/gateways/cash.mdx index 170f20af..4b61034b 100644 --- a/content/docs/ledger/payments/gateways/cash.mdx +++ b/content/docs/ledger/payments/gateways/cash.mdx @@ -3,8 +3,6 @@ title: Cash description: Configure the Cash gateway for manual and offline payment collection in Ledger. --- -# Cash - The Cash gateway records manual or offline payment collection without contacting an external processor. Use it when an operator collects cash, bank transfer confirmation, cheque payment, or another offline receipt and needs Ledger to record the invoice payment. ## Configuration diff --git a/content/docs/ledger/payments/gateways/gnu-taler.mdx b/content/docs/ledger/payments/gateways/gnu-taler.mdx index 6ed2b085..036be557 100644 --- a/content/docs/ledger/payments/gateways/gnu-taler.mdx +++ b/content/docs/ledger/payments/gateways/gnu-taler.mdx @@ -3,8 +3,6 @@ title: GNU Taler description: Configure the GNU Taler payment gateway for wallet payments, tenant-safe webhooks, refunds, diagnostics, and settlement checks. --- -# GNU Taler - GNU Taler is a wallet-based digital cash gateway for Ledger. Customers pay an invoice from a Taler wallet, the Taler Merchant Backend sends Ledger a tenant-scoped webhook, and Ledger updates the invoice, gateway transaction log, refund state, and settlement metadata. Use GNU Taler when you need privacy-preserving wallet payments, a deployed Taler Merchant Backend, and auditable payment/refund records inside Ledger. diff --git a/content/docs/ledger/payments/gateways/overview.mdx b/content/docs/ledger/payments/gateways/overview.mdx index 8dcd5fde..a31f5aae 100644 --- a/content/docs/ledger/payments/gateways/overview.mdx +++ b/content/docs/ledger/payments/gateways/overview.mdx @@ -3,8 +3,6 @@ title: Payment Gateways description: Configure GNU Taler, Stripe, Cash, and QPay payment gateways in Ledger. --- -# Payment Gateways - **Payment Gateways** connect Ledger to the services that collect, confirm, refund, and audit payments. Ledger includes drivers for **GNU Taler**, **Stripe**, **Cash**, and **QPay**, and exposes `PaymentGatewayManager::extend()` for registering custom drivers. Navigate to **Ledger -> Payments -> Gateways**. diff --git a/content/docs/ledger/payments/gateways/qpay.mdx b/content/docs/ledger/payments/gateways/qpay.mdx index 09084168..1572259b 100644 --- a/content/docs/ledger/payments/gateways/qpay.mdx +++ b/content/docs/ledger/payments/gateways/qpay.mdx @@ -3,8 +3,6 @@ title: QPay description: Configure QPay for Mongolian bank invoice payments in Ledger. --- -# QPay - QPay is Ledger's invoice-based gateway for Mongolian bank payments. Use it when customers pay through supported Mongolian bank applications and Ledger needs to track the invoice payment through the gateway transaction log. ## Configuration diff --git a/content/docs/ledger/payments/gateways/stripe.mdx b/content/docs/ledger/payments/gateways/stripe.mdx index f2142a54..86535df3 100644 --- a/content/docs/ledger/payments/gateways/stripe.mdx +++ b/content/docs/ledger/payments/gateways/stripe.mdx @@ -3,8 +3,6 @@ title: Stripe description: Configure Stripe for card payments, digital wallets, webhooks, refunds, and hosted checkout in Ledger. --- -# Stripe - Stripe is Ledger's card and digital-wallet gateway for global payment collection. Use it for hosted checkout, saved payment methods, card refunds, setup intents, and recurring payment workflows. ## Configuration diff --git a/content/docs/ledger/payments/overview.mdx b/content/docs/ledger/payments/overview.mdx index cc496cb5..9320eff2 100644 --- a/content/docs/ledger/payments/overview.mdx +++ b/content/docs/ledger/payments/overview.mdx @@ -3,8 +3,6 @@ title: Payments & Transactions description: Process digital payments, manage digital wallets, and track every financial transaction across your Fleetbase ecosystem. --- -# Payments & Transactions - The **Payments** module covers three interconnected areas: payment gateways for processing real money, wallets for tracking internal balances, and transactions as the immutable audit trail of every wallet movement. Navigate to **Ledger → Payments** to access gateways, wallets, and transactions. diff --git a/content/docs/ledger/payments/transactions.mdx b/content/docs/ledger/payments/transactions.mdx index 27d1a418..8b531638 100644 --- a/content/docs/ledger/payments/transactions.mdx +++ b/content/docs/ledger/payments/transactions.mdx @@ -3,8 +3,6 @@ title: Transactions description: View the immutable audit trail of every wallet movement — filter by type, status, direction, and date range. --- -# Transactions - A **Transaction** is the immutable record of money moving relative to a wallet. Transactions are never edited or deleted — they are the audit trail for every financial event in your system. Navigate to **Ledger → Payments → Transactions**. diff --git a/content/docs/ledger/payments/wallets.mdx b/content/docs/ledger/payments/wallets.mdx index e29f173e..13effe29 100644 --- a/content/docs/ledger/payments/wallets.mdx +++ b/content/docs/ledger/payments/wallets.mdx @@ -3,8 +3,6 @@ title: Wallets description: Manage digital wallets for drivers, customers, your company, and individual users — credit, top-up, transfer, payout, freeze, and recalculate. --- -# Wallets - A **Wallet** is a digital balance account within Ledger. Wallets track money owed to or held for a specific entity — a driver's earnings, a customer's prepaid credit, your organization's operating account, or an individual user's personal balance. Navigate to **Ledger → Payments → Wallets**. diff --git a/content/docs/ledger/recipes/payment-gateway-driver.mdx b/content/docs/ledger/recipes/payment-gateway-driver.mdx index 5b846d46..984fd505 100644 --- a/content/docs/ledger/recipes/payment-gateway-driver.mdx +++ b/content/docs/ledger/recipes/payment-gateway-driver.mdx @@ -3,8 +3,6 @@ title: Building a Payment Gateway Driver description: A complete walkthrough for adding a custom payment gateway to Ledger — interface, DTOs, webhook handling, registration, and testing. --- -# Building a Payment Gateway Driver - This recipe is a developer-facing walkthrough for adding a custom payment gateway to Ledger. By the end you'll have a driver that: - Renders its own configuration form in **Ledger → Settings → Gateways** diff --git a/content/docs/ledger/reports/ar-aging.mdx b/content/docs/ledger/reports/ar-aging.mdx index f1944c75..518fd7ec 100644 --- a/content/docs/ledger/reports/ar-aging.mdx +++ b/content/docs/ledger/reports/ar-aging.mdx @@ -3,8 +3,6 @@ title: AR Aging Report description: Monitor outstanding receivables — invoices bucketed by how many days overdue to prioritize collections. --- -# AR Aging Report - The **Accounts Receivable Aging** report categorizes all unpaid invoices by how long they have been outstanding. It helps you identify which customers are overdue and by how much, so you can prioritize collections and manage cash flow. Navigate to **Ledger → Reports → AR Aging**. diff --git a/content/docs/ledger/reports/balance-sheet.mdx b/content/docs/ledger/reports/balance-sheet.mdx index 8f877b65..76692293 100644 --- a/content/docs/ledger/reports/balance-sheet.mdx +++ b/content/docs/ledger/reports/balance-sheet.mdx @@ -3,8 +3,6 @@ title: Balance Sheet description: View your organization's financial position — assets, liabilities, and equity at a specific point in time. --- -# Balance Sheet - The **Balance Sheet** is a snapshot of your organization's financial position at a specific date. It answers the question: what does your organization own (assets) and what does it owe (liabilities and equity)? Navigate to **Ledger → Reports → Balance Sheet**. diff --git a/content/docs/ledger/reports/cash-flow.mdx b/content/docs/ledger/reports/cash-flow.mdx index d768e477..47eef387 100644 --- a/content/docs/ledger/reports/cash-flow.mdx +++ b/content/docs/ledger/reports/cash-flow.mdx @@ -3,8 +3,6 @@ title: Cash Flow Statement description: Track cash inflows and outflows — operating, financing, and investing activities — derived from movement on the Cash account. --- -# Cash Flow Statement - The **Cash Flow Statement** tracks the actual movement of cash into and out of your organization over a period. Unlike the income statement (which uses accrual accounting), the cash flow statement shows real cash movements — it is computed from journal entries that touch the Cash account (`CASH-DEFAULT`). Navigate to **Ledger → Reports → Cash Flow**. diff --git a/content/docs/ledger/reports/income-statement.mdx b/content/docs/ledger/reports/income-statement.mdx index a4c8400b..f0d0ca25 100644 --- a/content/docs/ledger/reports/income-statement.mdx +++ b/content/docs/ledger/reports/income-statement.mdx @@ -3,8 +3,6 @@ title: Income Statement description: Analyze revenue, expenses, and net income — your profit and loss statement for a selected period. --- -# Income Statement - The **Income Statement** (also called a Profit & Loss or P&L statement) summarizes your revenue, costs, and expenses during a specific period. It shows whether your organization made a profit or loss. Navigate to **Ledger → Reports → Income Statement**. diff --git a/content/docs/ledger/reports/overview.mdx b/content/docs/ledger/reports/overview.mdx index 409bc8b6..90ed85ca 100644 --- a/content/docs/ledger/reports/overview.mdx +++ b/content/docs/ledger/reports/overview.mdx @@ -3,8 +3,6 @@ title: Financial Reports description: Generate standard financial reports — balance sheet, income statement, cash flow, trial balance, AR aging, and wallet summary. --- -# Financial Reports - The **Reports** module generates standard financial statements from your Ledger data. Reports are computed on-the-fly from posted journal entries — always current and accurate. No pre-computation required. Navigate to **Ledger → Reports** to access all reports. diff --git a/content/docs/ledger/reports/trial-balance.mdx b/content/docs/ledger/reports/trial-balance.mdx index f84f1077..b642d689 100644 --- a/content/docs/ledger/reports/trial-balance.mdx +++ b/content/docs/ledger/reports/trial-balance.mdx @@ -3,8 +3,6 @@ title: Trial Balance description: Verify your books — a point-in-time list of all accounts with their total debits and credits confirming they balance. --- -# Trial Balance - The **Trial Balance** lists all accounts in your chart of accounts with their total debit and credit activity as of a specific date. Its primary purpose is to verify that total debits equal total credits — confirming that every journal entry was recorded correctly. Navigate to **Ledger → Reports → Trial Balance**. diff --git a/content/docs/ledger/reports/wallet-summary.mdx b/content/docs/ledger/reports/wallet-summary.mdx index e4549d57..94d2ce8b 100644 --- a/content/docs/ledger/reports/wallet-summary.mdx +++ b/content/docs/ledger/reports/wallet-summary.mdx @@ -3,8 +3,6 @@ title: Wallet Summary description: Get an overview of all wallet balances — counts by type and currency, period credits and debits, and the top 10 wallets by balance. --- -# Wallet Summary - The **Wallet Summary** report provides an analytical overview of all digital wallets in your Fleetbase ecosystem — wallet counts by subject type and currency, credit and debit totals for the selected period, and the top wallets by current balance. Navigate to **Ledger → Reports → Wallet Summary**. diff --git a/content/docs/ledger/settings/overview.mdx b/content/docs/ledger/settings/overview.mdx index d0de35ca..d8764377 100644 --- a/content/docs/ledger/settings/overview.mdx +++ b/content/docs/ledger/settings/overview.mdx @@ -3,8 +3,6 @@ title: Settings description: Configure organization-wide defaults — invoice prefix, payment terms, default gateway, default template, fiscal year, and base currency. --- -# Settings - Ledger exposes three settings groups under **Ledger → Settings**: | Group | Purpose | diff --git a/content/docs/pallet/audits/cycle-counts.mdx b/content/docs/pallet/audits/cycle-counts.mdx index 5285f839..2417abda 100644 --- a/content/docs/pallet/audits/cycle-counts.mdx +++ b/content/docs/pallet/audits/cycle-counts.mdx @@ -3,8 +3,6 @@ title: Cycle Counts description: Run cycle counts to verify physical stock levels against system records without a full stocktake. --- -# Cycle Counts - Run cycle counts to verify physical stock levels against system records without a full stocktake. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/audits/overview.mdx b/content/docs/pallet/audits/overview.mdx index d77cad45..0cabe6ff 100644 --- a/content/docs/pallet/audits/overview.mdx +++ b/content/docs/pallet/audits/overview.mdx @@ -3,15 +3,13 @@ title: Audits & Cycle Counts description: Maintain inventory accuracy with cycle counts and a full audit trail of all stock movements. --- -# Audits & Cycle Counts - Maintaining accurate inventory records is critical for any warehouse operation. If your digital records don't match your physical stock, you risk overselling products or failing to fulfill orders. The **Audits** module in Pallet provides the tools necessary to verify your inventory levels and maintain a complete history of all stock movements. ## The Audit Trail -Pallet automatically maintains a comprehensive audit trail for every item in your [Inventory](/docs/pallet/inventory). +Pallet automatically maintains a comprehensive audit trail for every item in your [Inventory](/docs/pallet/inventory/overview). Every time a stock level changes, Pallet records: - **What** changed (the specific Product and quantity). @@ -32,7 +30,7 @@ Cycle counting allows you to continuously verify your inventory accuracy without 1. Navigate to **Pallet** > **Audits** > **Cycle Counts** in the Fleetbase Console. 2. Click **New Cycle Count**. -3. Select the specific [Warehouse](/docs/pallet/warehouses) and the specific area (e.g., a single Zone or Aisle) you want to audit. +3. Select the specific [Warehouse](/docs/pallet/warehouses/overview) and the specific area (e.g., a single Zone or Aisle) you want to audit. 4. Pallet generates a list of all Products that are *supposed* to be in that area, along with their expected quantities. 5. A warehouse worker physically counts the items in the designated area and enters the actual quantities into Pallet. 6. Pallet compares the actual quantities against the expected quantities. diff --git a/content/docs/pallet/fulfillment/overview.mdx b/content/docs/pallet/fulfillment/overview.mdx index 68d157df..ecabc29f 100644 --- a/content/docs/pallet/fulfillment/overview.mdx +++ b/content/docs/pallet/fulfillment/overview.mdx @@ -3,9 +3,7 @@ title: Order Fulfillment description: Manage the full inbound and outbound order fulfillment lifecycle within Pallet. --- -# Order Fulfillment - -The **Fulfillment** module in Pallet handles the movement of goods into and out of your [Warehouses](/docs/pallet/warehouses). +The **Fulfillment** module in Pallet handles the movement of goods into and out of your [Warehouses](/docs/pallet/warehouses/overview). It provides the tools necessary to manage both inbound stock (receiving goods from suppliers) and outbound stock (picking and packing orders for customers). @@ -15,10 +13,10 @@ Inbound fulfillment is the process of receiving new inventory into a warehouse. This process is typically driven by a **[Purchase Order](/docs/pallet/fulfillment/purchase-orders)**. -1. You create a Purchase Order to request goods from a [Supplier](/docs/pallet/suppliers). +1. You create a Purchase Order to request goods from a [Supplier](/docs/pallet/suppliers/overview). 2. When the goods arrive at the warehouse, a worker uses Pallet to "Receive" the Purchase Order. 3. The worker verifies the quantities received against the quantities ordered. -4. Pallet automatically updates the [Inventory](/docs/pallet/inventory) levels, adding the new stock to the designated receiving [Bin](/docs/pallet/warehouses/zones-aisles-racks-bins). +4. Pallet automatically updates the [Inventory](/docs/pallet/inventory/overview) levels, adding the new stock to the designated receiving [Bin](/docs/pallet/warehouses/zones-aisles-racks-bins). 5. The stock can then be transferred from the receiving dock to its final storage location. ## Outbound Fulfillment (Shipping) @@ -32,7 +30,7 @@ If you are using [Storefront](/docs/storefront), a Sales Order is automatically The outbound fulfillment process involves several steps: ### 1. Order Allocation -When a Sales Order is created, Pallet checks the current [Inventory](/docs/pallet/inventory) levels. If sufficient stock is available, Pallet "allocates" the stock to the order. This prevents the same item from being sold twice. +When a Sales Order is created, Pallet checks the current [Inventory](/docs/pallet/inventory/overview) levels. If sufficient stock is available, Pallet "allocates" the stock to the order. This prevents the same item from being sold twice. ### 2. [Pick Lists](/docs/pallet/fulfillment/pick-lists) Pallet generates a Pick List for the warehouse workers. The Pick List details exactly which items need to be picked, and crucially, *where* they are located (Zone, Aisle, Rack, Bin). diff --git a/content/docs/pallet/fulfillment/pick-lists.mdx b/content/docs/pallet/fulfillment/pick-lists.mdx index cb1e029a..616e26c8 100644 --- a/content/docs/pallet/fulfillment/pick-lists.mdx +++ b/content/docs/pallet/fulfillment/pick-lists.mdx @@ -3,8 +3,6 @@ title: Pick Lists description: Generate pick lists for warehouse staff to efficiently collect items for fulfillment. --- -# Pick Lists - Generate pick lists for warehouse staff to efficiently collect items for fulfillment. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/fulfillment/purchase-orders.mdx b/content/docs/pallet/fulfillment/purchase-orders.mdx index 31d5f128..2640739a 100644 --- a/content/docs/pallet/fulfillment/purchase-orders.mdx +++ b/content/docs/pallet/fulfillment/purchase-orders.mdx @@ -3,8 +3,6 @@ title: Purchase Orders description: Create and manage purchase orders for restocking inventory from suppliers. --- -# Purchase Orders - Create and manage purchase orders for restocking inventory from suppliers. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/fulfillment/sales-orders.mdx b/content/docs/pallet/fulfillment/sales-orders.mdx index e961675f..135dedcd 100644 --- a/content/docs/pallet/fulfillment/sales-orders.mdx +++ b/content/docs/pallet/fulfillment/sales-orders.mdx @@ -3,8 +3,6 @@ title: Sales Orders description: Process and fulfill outbound sales orders, tracking items from pick to ship. --- -# Sales Orders - Process and fulfill outbound sales orders, tracking items from pick to ship. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/fulfillment/waves-and-batches.mdx b/content/docs/pallet/fulfillment/waves-and-batches.mdx index 1d4c65f3..c261af03 100644 --- a/content/docs/pallet/fulfillment/waves-and-batches.mdx +++ b/content/docs/pallet/fulfillment/waves-and-batches.mdx @@ -3,8 +3,6 @@ title: Waves & Batches description: Group pick lists into waves and batches for optimized warehouse picking operations. --- -# Waves & Batches - Group pick lists into waves and batches for optimized warehouse picking operations. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/getting-started/core-concepts.mdx b/content/docs/pallet/getting-started/core-concepts.mdx index 8a92dbde..0725b29a 100644 --- a/content/docs/pallet/getting-started/core-concepts.mdx +++ b/content/docs/pallet/getting-started/core-concepts.mdx @@ -2,3 +2,4 @@ title: Core Concepts description: Understand the key building blocks of Pallet — warehouses, inventory, fulfillment, and how they connect. --- + diff --git a/content/docs/pallet/getting-started/quickstart.mdx b/content/docs/pallet/getting-started/quickstart.mdx index cb11cc25..8eb7d68e 100644 --- a/content/docs/pallet/getting-started/quickstart.mdx +++ b/content/docs/pallet/getting-started/quickstart.mdx @@ -2,3 +2,4 @@ title: Quickstart description: Get up and running with Pallet — create your first warehouse, add products, and process your first order. --- + diff --git a/content/docs/pallet/index.mdx b/content/docs/pallet/index.mdx index 989d6475..61e8aa46 100644 --- a/content/docs/pallet/index.mdx +++ b/content/docs/pallet/index.mdx @@ -15,11 +15,11 @@ It is designed to work seamlessly alongside [Fleet-Ops](/docs/fleetops) (for dis Pallet provides the tools necessary to manage physical goods across multiple locations: -- **[Warehouses](/docs/pallet/warehouses)**: Define physical storage locations, including specific aisles, racks, and bins. -- **[Inventory](/docs/pallet/inventory)**: Track stock levels in real-time, including batch numbers and expiration dates. -- **[Fulfillment](/docs/pallet/fulfillment)**: Manage the picking, packing, and shipping process for outgoing orders. -- **[Suppliers](/docs/pallet/suppliers)**: Manage your vendors and generate purchase orders for restocking. -- **[Audits](/docs/pallet/audits)**: Conduct cycle counts and reconcile physical stock with digital records. +- **[Warehouses](/docs/pallet/warehouses/overview)**: Define physical storage locations, including specific aisles, racks, and bins. +- **[Inventory](/docs/pallet/inventory/overview)**: Track stock levels in real-time, including batch numbers and expiration dates. +- **[Fulfillment](/docs/pallet/fulfillment/overview)**: Manage the picking, packing, and shipping process for outgoing orders. +- **[Suppliers](/docs/pallet/suppliers/overview)**: Manage your vendors and generate purchase orders for restocking. +- **[Audits](/docs/pallet/audits/overview)**: Conduct cycle counts and reconcile physical stock with digital records. ## Integration with Storefront @@ -31,4 +31,4 @@ When fully integrated, an order placed in Storefront automatically triggers a fu To begin using Pallet, you must first install the extension via the Fleetbase CLI or the [Registry](/docs/platform/extensions). -Once installed, the Pallet module will appear in your Fleetbase Console sidebar, allowing you to begin configuring your first [Warehouse](/docs/pallet/warehouses). +Once installed, the Pallet module will appear in your Fleetbase Console sidebar, allowing you to begin configuring your first [Warehouse](/docs/pallet/warehouses/overview). diff --git a/content/docs/pallet/inventory/expired-stock.mdx b/content/docs/pallet/inventory/expired-stock.mdx index 09691d5b..ad0f72d0 100644 --- a/content/docs/pallet/inventory/expired-stock.mdx +++ b/content/docs/pallet/inventory/expired-stock.mdx @@ -3,8 +3,6 @@ title: Expired Stock description: Identify and manage stock that has passed its expiry date to maintain inventory accuracy. --- -# Expired Stock - Identify and manage stock that has passed its expiry date to maintain inventory accuracy. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/inventory/low-stock.mdx b/content/docs/pallet/inventory/low-stock.mdx index e44eb1dc..a24bb7d7 100644 --- a/content/docs/pallet/inventory/low-stock.mdx +++ b/content/docs/pallet/inventory/low-stock.mdx @@ -3,8 +3,6 @@ title: Low Stock Alerts description: Configure thresholds and monitor products that are running low to prevent stockouts. --- -# Low Stock Alerts - Configure thresholds and monitor products that are running low to prevent stockouts. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/inventory/overview.mdx b/content/docs/pallet/inventory/overview.mdx index 2bac4f84..dcb5d15e 100644 --- a/content/docs/pallet/inventory/overview.mdx +++ b/content/docs/pallet/inventory/overview.mdx @@ -3,9 +3,7 @@ title: Inventory Control description: Track and manage stock levels, adjustments, and transfers across your warehouses. --- -# Inventory Control - -The **Inventory** module in Pallet is where you track the physical quantities of goods stored across your [Warehouses](/docs/pallet/warehouses). +The **Inventory** module in Pallet is where you track the physical quantities of goods stored across your [Warehouses](/docs/pallet/warehouses/overview). Pallet provides real-time visibility into stock levels, allowing you to monitor what is available for sale, what is currently being picked for an order, and what needs to be restocked. @@ -18,7 +16,7 @@ The items you track in Pallet. If you are using [Storefront](/docs/storefront), The exact quantity of a specific Product located in a specific [Bin](/docs/pallet/warehouses/zones-aisles-racks-bins) within a Warehouse. Pallet tracks both the "On Hand" quantity (total physical stock) and the "Available" quantity (stock that has not yet been allocated to an active order). ### [Stock Adjustments](/docs/pallet/inventory/stock-adjustments) -Manual corrections to stock levels. Adjustments are used to record shrinkage (e.g., damaged goods, theft) or to correct discrepancies found during an [Audit](/docs/pallet/audits). +Manual corrections to stock levels. Adjustments are used to record shrinkage (e.g., damaged goods, theft) or to correct discrepancies found during an [Audit](/docs/pallet/audits/overview). ### [Stock Transfers](/docs/pallet/inventory/stock-transfers) The process of moving inventory from one location to another. This can be an internal transfer (e.g., moving stock from the Receiving Dock to Aisle 4) or an external transfer (e.g., moving stock from Warehouse A to Warehouse B). diff --git a/content/docs/pallet/inventory/products.mdx b/content/docs/pallet/inventory/products.mdx index 58f19bf8..bea4d3ba 100644 --- a/content/docs/pallet/inventory/products.mdx +++ b/content/docs/pallet/inventory/products.mdx @@ -3,8 +3,6 @@ title: Products description: Manage the product catalog within Pallet, including SKUs, units, and storage requirements. --- -# Products - Manage the product catalog within Pallet, including SKUs, units, and storage requirements. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/inventory/stock-adjustments.mdx b/content/docs/pallet/inventory/stock-adjustments.mdx index c898bd39..d1ded11d 100644 --- a/content/docs/pallet/inventory/stock-adjustments.mdx +++ b/content/docs/pallet/inventory/stock-adjustments.mdx @@ -3,8 +3,6 @@ title: Stock Adjustments description: Record manual stock adjustments for corrections, write-offs, and inventory reconciliation. --- -# Stock Adjustments - Record manual stock adjustments for corrections, write-offs, and inventory reconciliation. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/inventory/stock-levels.mdx b/content/docs/pallet/inventory/stock-levels.mdx index 3bfe596f..69c47d62 100644 --- a/content/docs/pallet/inventory/stock-levels.mdx +++ b/content/docs/pallet/inventory/stock-levels.mdx @@ -3,8 +3,6 @@ title: Stock Levels description: Monitor current stock levels across warehouses and bin locations in real time. --- -# Stock Levels - Monitor current stock levels across warehouses and bin locations in real time. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/inventory/stock-transfers.mdx b/content/docs/pallet/inventory/stock-transfers.mdx index 6ac90c09..f8a68cc6 100644 --- a/content/docs/pallet/inventory/stock-transfers.mdx +++ b/content/docs/pallet/inventory/stock-transfers.mdx @@ -3,8 +3,6 @@ title: Stock Transfers description: Move stock between warehouses or bin locations with tracked transfer records. --- -# Stock Transfers - Move stock between warehouses or bin locations with tracked transfer records. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/reports/overview.mdx b/content/docs/pallet/reports/overview.mdx index 3c0e980d..555e6ed6 100644 --- a/content/docs/pallet/reports/overview.mdx +++ b/content/docs/pallet/reports/overview.mdx @@ -3,8 +3,6 @@ title: Reports & Metrics description: Gain visibility into warehouse performance with inventory summaries, stock value reports, and order metrics. --- -# Reports & Metrics - Gain visibility into warehouse performance with inventory summaries, stock value reports, and order metrics. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/suppliers/overview.mdx b/content/docs/pallet/suppliers/overview.mdx index 74638ff6..795a5ad8 100644 --- a/content/docs/pallet/suppliers/overview.mdx +++ b/content/docs/pallet/suppliers/overview.mdx @@ -3,8 +3,6 @@ title: Suppliers description: Manage supplier records and associate them with purchase orders for streamlined procurement. --- -# Suppliers - Manage supplier records and associate them with purchase orders for streamlined procurement. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/warehouses/overview.mdx b/content/docs/pallet/warehouses/overview.mdx index 3ca2d3e7..5edb1dca 100644 --- a/content/docs/pallet/warehouses/overview.mdx +++ b/content/docs/pallet/warehouses/overview.mdx @@ -3,8 +3,6 @@ title: Warehouse Management description: Define and manage your warehouse structure — from the building down to individual bin locations. --- -# Warehouse Management - In Pallet, a **Warehouse** is the foundational entity for managing physical inventory. A Warehouse represents a physical building or facility where goods are stored, picked, packed, and shipped. diff --git a/content/docs/pallet/warehouses/warehouses.mdx b/content/docs/pallet/warehouses/warehouses.mdx index 12fbdc09..18956aa5 100644 --- a/content/docs/pallet/warehouses/warehouses.mdx +++ b/content/docs/pallet/warehouses/warehouses.mdx @@ -3,8 +3,6 @@ title: Warehouses description: Create and manage warehouse records, including address, capacity, and operational details. --- -# Warehouses - Create and manage warehouse records, including address, capacity, and operational details. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/pallet/warehouses/zones-aisles-racks-bins.mdx b/content/docs/pallet/warehouses/zones-aisles-racks-bins.mdx index a6acfa77..02a69cbf 100644 --- a/content/docs/pallet/warehouses/zones-aisles-racks-bins.mdx +++ b/content/docs/pallet/warehouses/zones-aisles-racks-bins.mdx @@ -3,8 +3,6 @@ title: Zones, Aisles, Racks & Bins description: Structure your warehouse with zones, aisles, racks, sections, and bin locations for precise inventory placement. --- -# Zones, Aisles, Racks & Bins - Structure your warehouse with zones, aisles, racks, sections, and bin locations for precise inventory placement. > This page is coming soon. Content is actively being developed. diff --git a/content/docs/platform/console-features/chat.mdx b/content/docs/platform/console-features/chat.mdx index 6b755c59..4e6bda8f 100644 --- a/content/docs/platform/console-features/chat.mdx +++ b/content/docs/platform/console-features/chat.mdx @@ -3,8 +3,6 @@ title: Chat description: Real-time messaging built into the Fleetbase Console — create channels, message team members, and share files without leaving the platform. --- -# Chat - Fleetbase includes a real-time chat system built into the console. Dispatchers and team members can message each other directly, create group channels, and share files — all from a persistent chat tray in the top navigation bar. Chat is powered by the SocketCluster WebSocket layer and delivers messages in real time without polling. diff --git a/content/docs/platform/console-features/custom-fields.mdx b/content/docs/platform/console-features/custom-fields.mdx index ff74d8df..9e7881b3 100644 --- a/content/docs/platform/console-features/custom-fields.mdx +++ b/content/docs/platform/console-features/custom-fields.mdx @@ -3,8 +3,6 @@ title: Custom Fields description: Add structured custom data fields to any platform resource using the Custom Fields Manager — no code required. --- -# Custom Fields - Custom Fields let you attach additional structured data to platform resources — orders, drivers, vehicles, contacts, and more — without writing code. Fields are organized into named groups, rendered inline on resource detail views, and returned in API responses. The Custom Fields Manager is embedded inside the settings panel of each extension that supports it (for example, **Fleet-Ops → Settings → Custom Fields**). diff --git a/content/docs/platform/console-features/dashboards-and-widgets.mdx b/content/docs/platform/console-features/dashboards-and-widgets.mdx index c361b38e..fd647f1f 100644 --- a/content/docs/platform/console-features/dashboards-and-widgets.mdx +++ b/content/docs/platform/console-features/dashboards-and-widgets.mdx @@ -3,8 +3,6 @@ title: Dashboards & Widgets description: Build and customize dashboards with drag-and-drop widgets. Each user can maintain multiple dashboards per extension context. --- -# Dashboards & Widgets - The Fleetbase Console home screen is a fully customizable dashboard. Drag, resize, and arrange widgets to surface the metrics and views most relevant to your work. Extensions register their own widget types, and each user can create and manage multiple dashboards. ![Home dashboard — GridStack widget grid with stat cards, charts, and extension widgets](/images/screenshots/general/console-dashboard.webp) diff --git a/content/docs/platform/console-features/internationalization.mdx b/content/docs/platform/console-features/internationalization.mdx index 8ae93f2a..77abefc4 100644 --- a/content/docs/platform/console-features/internationalization.mdx +++ b/content/docs/platform/console-features/internationalization.mdx @@ -3,8 +3,6 @@ title: Internationalization description: Switch the console UI language using the locale selector in the top navigation bar. --- -# Internationalization - The Fleetbase Console is available in multiple languages. Users can switch their language at any time using the **locale selector** in the top navigation bar. The selection is saved to the user's account and applies immediately without a page reload. ## Switching Language diff --git a/content/docs/platform/console-features/navigation.mdx b/content/docs/platform/console-features/navigation.mdx index 4bca5c0e..9c96ac20 100644 --- a/content/docs/platform/console-features/navigation.mdx +++ b/content/docs/platform/console-features/navigation.mdx @@ -3,8 +3,6 @@ title: Navigation description: How the Fleetbase console navigation works — the top navbar, extension menu, sidebar, and user controls. --- -# Navigation - The Fleetbase Console uses a two-part navigation structure: a **top navigation bar** and a **contextual sidebar**. Together they give quick access to every installed extension and the console's built-in features. ![Fleetbase Console — top navbar with extension menu, sidebar, and main content area](/images/screenshots/general/console-full-nav-sidebar.webp) diff --git a/content/docs/platform/console-features/notifications.mdx b/content/docs/platform/console-features/notifications.mdx index 66300752..f8ba89b8 100644 --- a/content/docs/platform/console-features/notifications.mdx +++ b/content/docs/platform/console-features/notifications.mdx @@ -3,8 +3,6 @@ title: Notifications description: Real-time in-console notifications for platform events — view, mark as read, and manage from the notification tray or the full notifications page. --- -# Notifications - The Fleetbase Console delivers real-time notifications for platform events — order assignments, status changes, system alerts, and more. Notifications arrive via SocketCluster and appear immediately without requiring a page refresh. ## The Notification Tray diff --git a/content/docs/platform/developer-console/api-keys.mdx b/content/docs/platform/developer-console/api-keys.mdx index 6487c429..3cf242d0 100644 --- a/content/docs/platform/developer-console/api-keys.mdx +++ b/content/docs/platform/developer-console/api-keys.mdx @@ -3,8 +3,6 @@ title: API Keys description: Generate and manage API credentials for authenticating requests to the Fleetbase REST API. --- -# API Keys - API keys are the credentials used to authenticate requests to the Fleetbase REST API. Each key belongs to either the **Test** or **Live** environment and can be scoped to a specific expiry window. Navigate to **Developers → API Keys** to manage them. ![API Keys list — Name, Public Key, Secret Key, Environment badge, Expiry, Last Used columns](/images/screenshots/developers/developers-api-keys-management.webp) diff --git a/content/docs/platform/developer-console/index.mdx b/content/docs/platform/developer-console/index.mdx index b67cd38d..06232a12 100644 --- a/content/docs/platform/developer-console/index.mdx +++ b/content/docs/platform/developer-console/index.mdx @@ -3,8 +3,6 @@ title: Developer Console description: The Developer Console gives you the tools to authenticate API calls, receive event notifications, and monitor real-time traffic across your Fleetbase instance. --- -# Developer Console - The **Developer Console** is the integration hub built into the Fleetbase Console. It is accessible from the main sidebar under **Developers** and provides everything you need to connect external systems, build custom applications, and monitor API activity. ![Developer Console sidebar — Developers section with API Keys, Webhooks, Socket Events, System Events, and Request Logs](/images/screenshots/developers/developers-api-keys-management.webp) diff --git a/content/docs/platform/developer-console/request-logs.mdx b/content/docs/platform/developer-console/request-logs.mdx index f7690c97..12770744 100644 --- a/content/docs/platform/developer-console/request-logs.mdx +++ b/content/docs/platform/developer-console/request-logs.mdx @@ -3,8 +3,6 @@ title: Request Logs description: Inspect a complete, filterable history of every API request made to your Fleetbase instance. --- -# Request Logs - Request Logs records every inbound API request to your Fleetbase instance. Use it to debug integration issues, audit API usage, or trace unexpected behaviour back to a specific call. Navigate to **Developers → Request Logs**. ![Request Logs list — Description, Status badge, ID, API Credential, Method, Version, Date columns](/images/screenshots/developers/developers-request-logs.webp) diff --git a/content/docs/platform/developer-console/socket-events.mdx b/content/docs/platform/developer-console/socket-events.mdx index a74364d7..3c16d646 100644 --- a/content/docs/platform/developer-console/socket-events.mdx +++ b/content/docs/platform/developer-console/socket-events.mdx @@ -3,8 +3,6 @@ title: Socket Events description: Monitor live WebSocket channels and subscribe to real-time event streams from your Fleetbase instance. --- -# Socket Events - Fleetbase uses **SocketCluster** to broadcast real-time events over WebSocket connections. The Socket Events panel in the Developer Console lets you browse available channels and watch live event output directly in the console. Navigate to **Developers → Socket Events**. ![Socket Events list — Listen button and Channel name columns for each available channel](/images/screenshots/developers/developers-websockets.webp) diff --git a/content/docs/platform/developer-console/system-events.mdx b/content/docs/platform/developer-console/system-events.mdx index 983a6954..24afe7e6 100644 --- a/content/docs/platform/developer-console/system-events.mdx +++ b/content/docs/platform/developer-console/system-events.mdx @@ -3,8 +3,6 @@ title: System Events description: Browse a searchable log of all API events emitted by your Fleetbase instance — useful for auditing and debugging integrations. --- -# System Events - System Events is a log of every API event emitted by your Fleetbase instance. Every time an action triggers an event — an order changes state, a driver is created, a webhook fires — that event is recorded here. Navigate to **Developers → System Events**. ![System Events list — Event description, Code, ID, and Date columns](/images/screenshots/developers/developers-events.webp) diff --git a/content/docs/platform/developer-console/webhooks.mdx b/content/docs/platform/developer-console/webhooks.mdx index b5c2560d..130dbf96 100644 --- a/content/docs/platform/developer-console/webhooks.mdx +++ b/content/docs/platform/developer-console/webhooks.mdx @@ -3,8 +3,6 @@ title: Webhooks description: Configure webhook endpoints to receive real-time HTTP callbacks when events occur in your Fleetbase instance. --- -# Webhooks - Webhooks push event notifications to your own servers the moment something happens in Fleetbase — an order is dispatched, a driver location changes, a contact is created. Navigate to **Developers → Webhooks** to manage your endpoints. ![Webhooks list — URL, Status badge, Mode badge, Version, Created columns](/images/screenshots/developers/developers-webhooks-management.webp) diff --git a/content/docs/platform/extensions/browsing-and-installing.mdx b/content/docs/platform/extensions/browsing-and-installing.mdx index 634f9231..4ea073c1 100644 --- a/content/docs/platform/extensions/browsing-and-installing.mdx +++ b/content/docs/platform/extensions/browsing-and-installing.mdx @@ -3,8 +3,6 @@ title: Browsing & Installing description: Browse the Fleetbase extension registry and install extensions via the console or the CLI. --- -# Browsing & Installing Extensions - Extensions are discovered and installed from the **Extensions** section in the top navigation bar of the Fleetbase Console, or using the `flb` CLI on a self-hosted instance. ## Browsing the Registry diff --git a/content/docs/platform/extensions/index.mdx b/content/docs/platform/extensions/index.mdx index b3137a3a..ca56b026 100644 --- a/content/docs/platform/extensions/index.mdx +++ b/content/docs/platform/extensions/index.mdx @@ -3,8 +3,6 @@ title: Extensions description: Extend Fleetbase with modular extensions — install from the registry, manage installed extensions, or publish your own. --- -# Extensions - Fleetbase is built on a modular architecture. The core platform provides identity management, API routing, and real-time events — the actual logistics capabilities are delivered by **Extensions**. Extensions are installable packages that add specific features, workflows, or integrations to your instance. You can install official extensions, purchase community extensions, or build and publish your own. diff --git a/content/docs/platform/extensions/managing-extensions.mdx b/content/docs/platform/extensions/managing-extensions.mdx index 086211f5..05cdd37a 100644 --- a/content/docs/platform/extensions/managing-extensions.mdx +++ b/content/docs/platform/extensions/managing-extensions.mdx @@ -3,8 +3,6 @@ title: Managing Extensions description: View installed extensions, uninstall them, and manage developer credentials for publishing to the registry. --- -# Managing Extensions - Once extensions are installed you can view, remove, and manage them from the **Extensions** section in the top navigation bar. ## Installed Extensions diff --git a/content/docs/platform/getting-started/architecture.mdx b/content/docs/platform/getting-started/architecture.mdx index c0af7fbf..ee62a0c4 100644 --- a/content/docs/platform/getting-started/architecture.mdx +++ b/content/docs/platform/getting-started/architecture.mdx @@ -3,8 +3,6 @@ title: Architecture description: How Fleetbase is structured — the API backend, Ember.js console, real-time engine, extension system, and infrastructure requirements. --- -# Architecture - Fleetbase follows a **modular, API-first architecture** with a clear separation between the backend API layer, the frontend console, and the real-time event system. Extensions plug into both the backend and frontend simultaneously, making each module a first-class part of the platform rather than an external integration. ## High-Level Overview diff --git a/content/docs/platform/getting-started/overview.mdx b/content/docs/platform/getting-started/overview.mdx index 300c1255..ae7be668 100644 --- a/content/docs/platform/getting-started/overview.mdx +++ b/content/docs/platform/getting-started/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: What Fleetbase is, how it works, and who it's built for — a complete picture of the platform before you dive in. --- -# Overview - Fleetbase is an open-source **Logistics and Supply Chain Operating System (LSOS)** — a modular, API-first platform that gives logistics operators and software developers production-ready infrastructure they can deploy on their own terms, extend without limits, and own completely. At its core, Fleetbase provides the foundation every logistics business needs: multi-tenant organisation management, identity and access control, a real-time event bus, a REST API, and a developer console for managing integrations. On top of that foundation, you install the modules you need — Fleet-Ops for fleet management, Storefront for e-commerce, Pallet for inventory, Ledger for accounting — or you build your own. diff --git a/content/docs/platform/getting-started/why-fleetbase.mdx b/content/docs/platform/getting-started/why-fleetbase.mdx index 526bc36f..1c7f12ee 100644 --- a/content/docs/platform/getting-started/why-fleetbase.mdx +++ b/content/docs/platform/getting-started/why-fleetbase.mdx @@ -3,8 +3,6 @@ title: Why Fleetbase description: Why logistics and supply chain operations choose Fleetbase — ownership, transparency, and freedom from the constraints of closed enterprise software. --- -# Why Fleetbase - Logistics operations run on software that was never really built for them. Enterprise platforms built for large carriers don't fit the way a regional courier or on-demand delivery business actually works. Lightweight SaaS tools hit ceilings the moment operations get complex. And the pricing models of closed platforms — per-driver, per-order, per-seat — treat your growth as a liability. Fleetbase is a different kind of logistics platform. It's open-source, self-hostable, and built to be shaped around how your operation actually works — not the other way around. diff --git a/content/docs/platform/identity-and-access/groups.mdx b/content/docs/platform/identity-and-access/groups.mdx index c013fa91..c5937667 100644 --- a/content/docs/platform/identity-and-access/groups.mdx +++ b/content/docs/platform/identity-and-access/groups.mdx @@ -3,8 +3,6 @@ title: Groups description: Organize users into groups to simplify access management — assign policies once and apply them to a collection of users at once. --- -# Groups - Groups let you collect users together under a shared name. Rather than attaching policies to each user individually, you attach them to a group and add users to it. Navigate to **IAM → Groups** to manage them. ![Groups list — Name, Description, Members avatar stack, Created columns](/images/screenshots/iam/iam-groups-management.webp) diff --git a/content/docs/platform/identity-and-access/organizations.mdx b/content/docs/platform/identity-and-access/organizations.mdx index d9d1a5e5..dc6dc427 100644 --- a/content/docs/platform/identity-and-access/organizations.mdx +++ b/content/docs/platform/identity-and-access/organizations.mdx @@ -3,8 +3,6 @@ title: Organizations description: Understand the two distinct organization views in Fleetbase — the system-wide admin list and your personal organization membership panel. --- -# Organizations - Fleetbase is multi-tenant by design. A single instance can host multiple fully isolated organizations, each with their own users, data, API keys, extensions, and settings. No data crosses organization boundaries unless explicitly shared through the API. There are two distinct places in the console where organizations appear — one for system-level administrators, and one for every user managing their own membership. diff --git a/content/docs/platform/identity-and-access/policies.mdx b/content/docs/platform/identity-and-access/policies.mdx index b9381013..b499d832 100644 --- a/content/docs/platform/identity-and-access/policies.mdx +++ b/content/docs/platform/identity-and-access/policies.mdx @@ -3,8 +3,6 @@ title: Policies description: Create reusable permission bundles that can be attached to users and roles across your Fleetbase organization. --- -# Policies - Policies are reusable bundles of permissions that can be attached to users or roles. Where a role defines a user's primary access level, policies let you grant additional, targeted permissions without creating a whole new role for each combination. Navigate to **IAM → Policies** to manage them. ![Policies list — Name, Description, Service, Type, Created columns](/images/screenshots/iam/iam-policy-management.webp) diff --git a/content/docs/platform/identity-and-access/roles-and-permissions.mdx b/content/docs/platform/identity-and-access/roles-and-permissions.mdx index fb78453c..5f56e176 100644 --- a/content/docs/platform/identity-and-access/roles-and-permissions.mdx +++ b/content/docs/platform/identity-and-access/roles-and-permissions.mdx @@ -3,8 +3,6 @@ title: Roles & Permissions description: Create and assign roles that grant users access to specific resources and actions across the Fleetbase platform. --- -# Roles & Permissions - Roles are named collections of permissions. Assigning a role to a user grants them everything that role allows. Fleetbase ships with a set of built-in roles and lets you create custom roles with granular, per-resource permissions. Navigate to **IAM → Roles** to manage them. ![Roles list — Name, Description, Service, Type, Created columns](/images/screenshots/iam/iam-roles-management.webp) diff --git a/content/docs/platform/identity-and-access/two-factor-authentication.mdx b/content/docs/platform/identity-and-access/two-factor-authentication.mdx index 7f0f239f..2f925315 100644 --- a/content/docs/platform/identity-and-access/two-factor-authentication.mdx +++ b/content/docs/platform/identity-and-access/two-factor-authentication.mdx @@ -3,8 +3,6 @@ title: Two-Factor Authentication description: Enable 2FA on your personal account, enforce it for your organization, or configure it system-wide for all users. --- -# Two-Factor Authentication - Two-factor authentication (2FA) adds a second verification step to login. After entering a password, users must confirm a one-time code before gaining access. There are three levels where 2FA can be configured: | Level | Where | Who controls it | diff --git a/content/docs/platform/identity-and-access/user-management.mdx b/content/docs/platform/identity-and-access/user-management.mdx index fb30b0bd..8f2cec4a 100644 --- a/content/docs/platform/identity-and-access/user-management.mdx +++ b/content/docs/platform/identity-and-access/user-management.mdx @@ -3,6 +3,4 @@ title: User Management description: Invite, deactivate, and manage users across your organization — including bulk operations and status controls. --- -# User Management - Invite new users by email, assign them roles, and manage their access from the IAM panel. Users can be deactivated without deleting their data, and re-activated at any time. diff --git a/content/docs/platform/identity-and-access/users.mdx b/content/docs/platform/identity-and-access/users.mdx index 5f03ac4a..f32261b1 100644 --- a/content/docs/platform/identity-and-access/users.mdx +++ b/content/docs/platform/identity-and-access/users.mdx @@ -3,8 +3,6 @@ title: Users description: Invite, create, and manage users in your Fleetbase organization — roles, statuses, permissions, and lifecycle actions. --- -# Users - Every person with access to Fleetbase has a user account. Users belong to an organization, carry a role, and can have additional policies and permissions attached directly. Navigate to **IAM → Users** to manage them. ![IAM Users list — Name, Email, Phone, Role, Status, Last Login columns](/images/screenshots/iam/iam-users-management.webp) diff --git a/content/docs/platform/index.mdx b/content/docs/platform/index.mdx index cb2967c0..10d3ac93 100644 --- a/content/docs/platform/index.mdx +++ b/content/docs/platform/index.mdx @@ -3,8 +3,6 @@ title: Core Platform description: The Fleetbase core platform covers identity management, developer tooling, extensions, and built-in platform features. --- -# Core Platform - The Fleetbase core platform is the foundation that underpins every module and extension. It handles the concerns that every serious logistics system needs: multi-tenant organisation management, role-based access control, a real-time event bus, a REST API, and a developer console for managing integrations. Start with the [Platform Overview](/docs/platform/getting-started/overview) for a complete introduction, or jump straight to a quickstart if you already know what you need. diff --git a/content/docs/platform/quickstart/cloud-quickstart.mdx b/content/docs/platform/quickstart/cloud-quickstart.mdx index 0d167d7c..9f93067b 100644 --- a/content/docs/platform/quickstart/cloud-quickstart.mdx +++ b/content/docs/platform/quickstart/cloud-quickstart.mdx @@ -3,8 +3,6 @@ title: Cloud Quickstart description: Sign up for Fleetbase Cloud, complete onboarding, and get to your first driver, order, and API call. --- -# Cloud Quickstart - Fleetbase Cloud is the fastest way to get started. Your environment is provisioned and pre-configured during signup — no infrastructure or setup required. This guide walks you through every step of the onboarding flow with screenshots, then covers what to do first once you're in. The cloud onboarding flow has five top-level steps: **Create Account → Verify Email → Choose Deployment → Configure Workspace → Start Your Trial**. The Configure Workspace step has seven internal substeps that personalise your console. @@ -29,7 +27,7 @@ The cloud onboarding flow has five top-level steps: **Create Account → Verify <Step> ### Choose Deployment - Pick how you want to run Fleetbase. **Cloud (SaaS)** is fully managed and ready in minutes — that's the path this guide covers. **Self-Managed** deploys to your own cloud or on-premise infrastructure (see the [Self-Hosted Quickstart](/docs/platform/quickstart) for that flow). + Pick how you want to run Fleetbase. **Cloud (SaaS)** is fully managed and ready in minutes — that's the path this guide covers. **Self-Managed** deploys to your own cloud or on-premise infrastructure (see the [Self-Hosted Quickstart](/docs/platform/quickstart/cloud-quickstart) for that flow). ![Onboarding — Choose Deployment with Cloud (SaaS) and Self-Managed options](/images/screenshots/general/console-onboard-choose-deployment-step.webp) </Step> @@ -119,9 +117,9 @@ Once you're in the console, these are the three most useful things to get done: - **[Create an API Key](/docs/platform/developer-console/api-keys)** — Go to **Developer Console → API Keys** and generate your first key. You'll need this to connect any external system, app, or integration to your Fleetbase instance. -- **[Add your first driver and get Navigator](/docs/fleet-ops/drivers)** — Go to **Fleet-Ops → Drivers** to add your driver roster. Each driver uses the **Fleetbase Navigator** mobile app to receive orders, update status, and submit proof of delivery — share the download link from the driver profile. +- **[Add your first driver and get Navigator](/docs/fleet-ops/resources/drivers/overview)** — Go to **Fleet-Ops → Drivers** to add your driver roster. Each driver uses the **Fleetbase Navigator** mobile app to receive orders, update status, and submit proof of delivery — share the download link from the driver profile. -- **[Create your first order](/docs/fleet-ops/orders)** — Go to **Fleet-Ops → Orders** and dispatch a delivery. Assign it to a driver and watch it move through the status lifecycle on the live map in real time. +- **[Create your first order](/docs/fleet-ops/operations/orders/overview)** — Go to **Fleet-Ops → Orders** and dispatch a delivery. Assign it to a driver and watch it move through the status lifecycle on the live map in real time. ## Common resources @@ -133,7 +131,7 @@ Once you're in the console, these are the three most useful things to get done: </CardHeader> <CardContent> <div className="flex flex-col gap-1.5 text-sm"> - <a href="/docs/fleet-ops/orders" className="text-primary hover:underline">Orders overview →</a> + <a href="/docs/fleet-ops/operations/orders/overview" className="text-primary hover:underline">Orders overview →</a> <a href="/docs/fleet-ops/orders/importing" className="text-primary hover:underline">How to import orders →</a> <a href="/docs/fleet-ops/orders/order-config" className="text-primary hover:underline">How to configure order types →</a> </div> @@ -146,7 +144,7 @@ Once you're in the console, these are the three most useful things to get done: </CardHeader> <CardContent> <div className="flex flex-col gap-1.5 text-sm"> - <a href="/docs/fleet-ops/drivers" className="text-primary hover:underline">How to add drivers →</a> + <a href="/docs/fleet-ops/resources/drivers/overview" className="text-primary hover:underline">How to add drivers →</a> <a href="/docs/fleet-ops/drivers/importing" className="text-primary hover:underline">How to import drivers →</a> <a href="/docs/fleet-ops/service-areas" className="text-primary hover:underline">How to set up service areas →</a> </div> diff --git a/content/docs/platform/quickstart/deploy-in-cloud.mdx b/content/docs/platform/quickstart/deploy-in-cloud.mdx index 493d182e..285ed101 100644 --- a/content/docs/platform/quickstart/deploy-in-cloud.mdx +++ b/content/docs/platform/quickstart/deploy-in-cloud.mdx @@ -3,8 +3,6 @@ title: Deploy in Cloud description: Self-host Fleetbase on AWS, GCP, DigitalOcean, or any Linux server — Docker Compose deployment, Nginx reverse proxy, and SSL setup. --- -# Deploy in Cloud - This guide covers deploying Fleetbase to infrastructure you control — a VM on AWS, GCP, DigitalOcean, or any Linux server with Docker installed. <Callout type="info"> diff --git a/content/docs/platform/quickstart/development-setup.mdx b/content/docs/platform/quickstart/development-setup.mdx index 7b80ea0e..9fea8144 100644 --- a/content/docs/platform/quickstart/development-setup.mdx +++ b/content/docs/platform/quickstart/development-setup.mdx @@ -3,8 +3,6 @@ title: Development Setup description: Set up a Fleetbase development environment — mount live source, link packages, and work on extensions with hot reload. --- -# Development Setup - This guide is for contributors and extension developers who need to work directly on Fleetbase source code or link a local package into a running instance. If you just want to run Fleetbase locally without modifying its internals, see [Running Locally](/docs/platform/quickstart/running-locally) instead. ## Prerequisites diff --git a/content/docs/platform/quickstart/infrastructure-sizing.mdx b/content/docs/platform/quickstart/infrastructure-sizing.mdx index a1b13f4f..b0679f27 100644 --- a/content/docs/platform/quickstart/infrastructure-sizing.mdx +++ b/content/docs/platform/quickstart/infrastructure-sizing.mdx @@ -3,8 +3,6 @@ title: Infrastructure Sizing description: Reference architecture, sizing assumptions, and production bill of quantities for self-hosted and on-premise Fleetbase deployments. --- -# Infrastructure Sizing - This guide gives infrastructure teams a practical baseline for planning self-hosted, private cloud, or on-premise Fleetbase deployments. Treat these numbers as planning guidance, not a fixed benchmark. Final sizing depends on active vehicles and devices, active drivers, order volume, telemetry frequency, concurrent users, custom extensions, uploaded media, integration traffic, and retention policy. Fleetbase does not require GPU resources for the core platform. GPU capacity is only relevant if you run separate AI, computer vision, route optimization, or analytics workloads outside the standard Fleetbase application stack. diff --git a/content/docs/platform/quickstart/running-locally.mdx b/content/docs/platform/quickstart/running-locally.mdx index 97a26e05..e76e0228 100644 --- a/content/docs/platform/quickstart/running-locally.mdx +++ b/content/docs/platform/quickstart/running-locally.mdx @@ -3,8 +3,6 @@ title: Running Locally description: Run the full Fleetbase stack on your local machine using Docker Compose — for evaluation, testing, and local use. --- -# Running Locally - Fleetbase ships with a `docker-compose.yml` that boots the entire stack — API, console, database, Redis, SocketCluster, queue workers, and scheduler — with a single command. This is the recommended setup for local development and testing. ## Prerequisites diff --git a/content/docs/platform/recipes/build-a-custom-integration.mdx b/content/docs/platform/recipes/build-a-custom-integration.mdx index d8bc0117..914d8a0f 100644 --- a/content/docs/platform/recipes/build-a-custom-integration.mdx +++ b/content/docs/platform/recipes/build-a-custom-integration.mdx @@ -3,8 +3,6 @@ title: Build a Custom Integration description: Use the Fleetbase REST API and webhooks to integrate an external system — push orders in, receive status events out, handle retries safely. --- -# Build a Custom Integration - This recipe shows a complete, production-ready integration pattern: an external system (ERP, WMS, or e-commerce platform) that creates orders in Fleetbase via the REST API, then receives real-time status updates back via webhooks. ## Integration Architecture diff --git a/content/docs/platform/recipes/configure-custom-fields.mdx b/content/docs/platform/recipes/configure-custom-fields.mdx index 6fe7b0bb..b4d2a258 100644 --- a/content/docs/platform/recipes/configure-custom-fields.mdx +++ b/content/docs/platform/recipes/configure-custom-fields.mdx @@ -3,8 +3,6 @@ title: Configure Custom Fields description: Add structured custom data fields to drivers, vehicles, contacts, and other resources — then read them back via the API. --- -# Configure Custom Fields - Custom Fields let you attach additional structured data to platform resources — drivers, vehicles, contacts, and more — without writing an extension. Fields are defined in the console settings panel, rendered inline on resource detail views, and returned automatically in API responses. <Callout type="info"> diff --git a/content/docs/platform/recipes/connect-your-first-webhook.mdx b/content/docs/platform/recipes/connect-your-first-webhook.mdx index 09f66103..4e7105fa 100644 --- a/content/docs/platform/recipes/connect-your-first-webhook.mdx +++ b/content/docs/platform/recipes/connect-your-first-webhook.mdx @@ -3,8 +3,6 @@ title: Connect Your First Webhook description: Set up a webhook endpoint to receive real-time event callbacks from Fleetbase — order created, driver assigned, status updated, and more. --- -# Connect Your First Webhook - Webhooks let Fleetbase push events to your backend the moment something happens — an order is dispatched, a driver's status changes, a contact is created. This recipe walks through building a receiver, registering it in the Developer Console, and verifying end-to-end delivery. ## What You'll Build diff --git a/content/docs/platform/recipes/set-up-real-time-tracking.mdx b/content/docs/platform/recipes/set-up-real-time-tracking.mdx index 80ed52dc..3f48ab96 100644 --- a/content/docs/platform/recipes/set-up-real-time-tracking.mdx +++ b/content/docs/platform/recipes/set-up-real-time-tracking.mdx @@ -3,8 +3,6 @@ title: Set Up Real-Time Tracking description: Subscribe to Fleetbase socket events to display live driver locations and order status updates in your own application or dashboard. --- -# Set Up Real-Time Tracking - Fleetbase broadcasts real-time events — driver location updates, order status changes, and platform events — over WebSocket using [SocketCluster](https://socketcluster.io/). This recipe shows how to subscribe to those channels from your own application and render live driver positions on a map. ## What You'll Build diff --git a/content/docs/platform/system-setup/branding.mdx b/content/docs/platform/system-setup/branding.mdx index 33ba7e91..74a0a8ae 100644 --- a/content/docs/platform/system-setup/branding.mdx +++ b/content/docs/platform/system-setup/branding.mdx @@ -3,8 +3,6 @@ title: Branding description: Customize your Fleetbase console with your organization's icon, logo, and default color theme. --- -# Branding - The Branding settings let you replace the default Fleetbase logo and icon with your own, and set the default color theme for the console. Navigate to **Admin → Branding** to access these settings. ![Branding settings — icon upload, logo upload, and default theme selector](/images/screenshots/admin/admin-branding.webp) diff --git a/content/docs/platform/system-setup/filesystem.mdx b/content/docs/platform/system-setup/filesystem.mdx index c0a661c3..bb0e7bd5 100644 --- a/content/docs/platform/system-setup/filesystem.mdx +++ b/content/docs/platform/system-setup/filesystem.mdx @@ -3,8 +3,6 @@ title: Filesystem description: Configure where Fleetbase stores file uploads — local disk, Amazon S3, Google Cloud Storage, or any S3-compatible provider. --- -# Filesystem - The Filesystem settings control where Fleetbase stores uploaded files — driver documents, proof of delivery photos, import CSVs, and other user-uploaded content. Navigate to **Admin → System Settings → Filesystem** to access these settings. ![Filesystem settings — Driver dropdown with S3 configuration fields visible](/images/screenshots/admin/admin-filesystem-s3.webp) diff --git a/content/docs/platform/system-setup/mail.mdx b/content/docs/platform/system-setup/mail.mdx index 5d2363ba..b919a4f7 100644 --- a/content/docs/platform/system-setup/mail.mdx +++ b/content/docs/platform/system-setup/mail.mdx @@ -3,8 +3,6 @@ title: Mail description: Configure the outbound mail driver Fleetbase uses for notifications, invitations, order updates, and system alerts. --- -# Mail - Fleetbase sends transactional email for account invitations, password resets, order notifications, and system alerts. The Mail settings panel lets you choose and configure the mail driver that powers all outbound email. Navigate to **Admin → System Settings → Mail** to access these settings. ![Mail settings — From Address, From Name, and Mailer configuration panel](/images/screenshots/admin/admin-mail-smtp.webp) diff --git a/content/docs/platform/system-setup/push-notifications.mdx b/content/docs/platform/system-setup/push-notifications.mdx index 0d584a72..c08308b0 100644 --- a/content/docs/platform/system-setup/push-notifications.mdx +++ b/content/docs/platform/system-setup/push-notifications.mdx @@ -3,8 +3,6 @@ title: Push Notifications description: Configure Apple Push Notification service (APNs) and Firebase Cloud Messaging (FCM) to send push notifications to the Navigator and Storefront mobile apps. --- -# Push Notifications - Fleetbase sends push notifications to the **Navigator** driver app and the **Storefront** customer app for order assignments, status updates, and alerts. Two channels are supported: Apple Push Notification service (APNs) for iOS, and Firebase Cloud Messaging (FCM) for Android. Navigate to **Admin → System Settings → Push Notifications** to configure them. ![Push Notifications settings — APNs and Firebase configuration panels](/images/screenshots/admin/admin-push-notifications.webp) diff --git a/content/docs/platform/system-setup/queue.mdx b/content/docs/platform/system-setup/queue.mdx index 8737e602..c997b034 100644 --- a/content/docs/platform/system-setup/queue.mdx +++ b/content/docs/platform/system-setup/queue.mdx @@ -3,8 +3,6 @@ title: Queue description: Configure the background job queue that powers webhook delivery, notifications, imports, and async processing in Fleetbase. --- -# Queue - Fleetbase uses Laravel's queue system to process background jobs — outbound webhook delivery, push notifications, bulk imports, report generation, and scheduled tasks. The Queue settings let you switch the queue driver and configure its connection details. Navigate to **Admin → System Settings → Queue** to access these settings. ![Queue settings — Driver dropdown and connection configuration fields](/images/screenshots/admin/admin-queue.webp) diff --git a/content/docs/platform/system-setup/services.mdx b/content/docs/platform/system-setup/services.mdx index 4a01c063..32b887a7 100644 --- a/content/docs/platform/system-setup/services.mdx +++ b/content/docs/platform/system-setup/services.mdx @@ -3,8 +3,6 @@ title: Services description: Configure third-party service integrations — AWS, Google Maps, Twilio SMS, Sentry error tracking, and IP geolocation. --- -# Services - The Services settings panel is where you connect Fleetbase to external APIs it uses across the platform — mapping, SMS, error monitoring, and IP geolocation. Navigate to **Admin → System Settings → Services** to access these settings. ![Services settings — AWS, Google Maps, Twilio, Sentry, and IP Info configuration sections](/images/screenshots/admin/admin-services.webp) diff --git a/content/docs/platform/system-setup/socket.mdx b/content/docs/platform/system-setup/socket.mdx index b593f005..2dc9ca9d 100644 --- a/content/docs/platform/system-setup/socket.mdx +++ b/content/docs/platform/system-setup/socket.mdx @@ -3,8 +3,6 @@ title: Socket description: Monitor the SocketCluster connection that powers real-time driver tracking, order status updates, and live console events. --- -# Socket - Fleetbase uses [SocketCluster](https://socketcluster.io/) for real-time bidirectional communication — live driver location updates on the map, order status changes pushed to the console without polling, and real-time events delivered to the Navigator app. Navigate to **Admin → System Settings → Socket** to monitor the connection. <Callout type="info"> diff --git a/content/docs/platform/system-setup/two-factor-authentication.mdx b/content/docs/platform/system-setup/two-factor-authentication.mdx index 08ab2faf..b66ff38d 100644 --- a/content/docs/platform/system-setup/two-factor-authentication.mdx +++ b/content/docs/platform/system-setup/two-factor-authentication.mdx @@ -3,8 +3,6 @@ title: Two-Factor Authentication description: Enable and enforce two-factor authentication system-wide for all users in your Fleetbase instance. --- -# Two-Factor Authentication - Two-factor authentication (2FA) adds a second verification step to the login flow. After entering their password, users must confirm a one-time code before gaining access. Navigate to **Admin → System Settings → Two-Factor Authentication** to configure 2FA system-wide. ![Two-Factor Authentication settings — Enable toggle, delivery Method selector, and Enforce toggle](/images/screenshots/admin/admin-two-fa.webp) diff --git a/content/docs/storefront/app/build-and-release.mdx b/content/docs/storefront/app/build-and-release.mdx index 8c901f61..bfd3c938 100644 --- a/content/docs/storefront/app/build-and-release.mdx +++ b/content/docs/storefront/app/build-and-release.mdx @@ -3,8 +3,6 @@ title: Build & Release description: Production builds for iOS, Android, and the web target — signing, versioning, and renaming for your brand. --- -# Build & Release - The Storefront App is a standard React Native project plus a Webpack-based web target. Production releases follow normal RN release procedures with a few project-specific notes. ## iOS Release Build diff --git a/content/docs/storefront/app/configuration.mdx b/content/docs/storefront/app/configuration.mdx index 163667d2..3dc22174 100644 --- a/content/docs/storefront/app/configuration.mdx +++ b/content/docs/storefront/app/configuration.mdx @@ -3,8 +3,6 @@ title: Configuration description: Complete reference for the Storefront App — every environment variable, every storefront.config.ts field, and what each one controls. --- -# Configuration - The Storefront App is configured by a combination of: 1. **Environment variables** in `.env`, read at build time via `react-native-config` (and inlined into the web build by Webpack). 2. **`storefront.config.ts`** at the project root, which delegates to `config/default.js` — the customization surface for tabs, theming, layout, and feature flags. diff --git a/content/docs/storefront/app/integrations.mdx b/content/docs/storefront/app/integrations.mdx index 5cd353c3..080461db 100644 --- a/content/docs/storefront/app/integrations.mdx +++ b/content/docs/storefront/app/integrations.mdx @@ -3,8 +3,6 @@ title: Integrations description: Wire up payments, social login, push notifications, and real-time order updates in the Storefront App. --- -# Integrations - The Storefront App ships with several integrations pre-wired. Most are gated behind environment flags and require credentials from the corresponding provider. ## Payments diff --git a/content/docs/storefront/app/overview.mdx b/content/docs/storefront/app/overview.mdx index 45e6518d..f2d3a622 100644 --- a/content/docs/storefront/app/overview.mdx +++ b/content/docs/storefront/app/overview.mdx @@ -3,8 +3,6 @@ title: Storefront App description: The Storefront App is the open-source React Native client your customers use to browse stores and place orders against your Fleetbase Storefront backend. --- -# Storefront App - The **Storefront App** is the open-source customer-facing client for the Storefront extension. It is a single React Native codebase that targets **iOS, Android, and the web**, paired with the Storefront backend running on your Fleetbase instance. [github.com/fleetbase/storefront-app](https://github.com/fleetbase/storefront-app) diff --git a/content/docs/storefront/app/quickstart.mdx b/content/docs/storefront/app/quickstart.mdx index bdd3a2bb..29ddfb8f 100644 --- a/content/docs/storefront/app/quickstart.mdx +++ b/content/docs/storefront/app/quickstart.mdx @@ -3,8 +3,6 @@ title: Quickstart description: Clone the Storefront App, install dependencies, configure your Fleetbase keys, and run it in iOS, Android, or web. --- -# Storefront App Quickstart - Get the Storefront App running locally against your Fleetbase backend in about 15 minutes. ## Prerequisites diff --git a/content/docs/storefront/app/theming.mdx b/content/docs/storefront/app/theming.mdx index 8636da65..e5512d71 100644 --- a/content/docs/storefront/app/theming.mdx +++ b/content/docs/storefront/app/theming.mdx @@ -3,8 +3,6 @@ title: Theming & Branding description: Customize colors, themes, fonts, app icon, splash screen, and display names for the Storefront App. --- -# Theming & Branding - The Storefront App uses [Tamagui](https://tamagui.dev) for theming. The setup combines a Tailwind-style color palette with named themes, plus runtime overrides via env vars for fast brand work without touching code. ## How Themes Work diff --git a/content/docs/storefront/catalog/categories.mdx b/content/docs/storefront/catalog/categories.mdx index 0bfe617a..bbb3da34 100644 --- a/content/docs/storefront/catalog/categories.mdx +++ b/content/docs/storefront/catalog/categories.mdx @@ -3,8 +3,6 @@ title: Categories description: Organize your products into categories for navigation and discoverability in your Storefront app. --- -# Categories - **Categories** organize products into logical groups for customer navigation. A category can represent a menu section ("Appetizers", "Mains", "Desserts"), a product type ("Electronics", "Clothing"), or any grouping that makes sense for your store. Navigate to **Storefront → Products** and use the category sidebar to manage categories. diff --git a/content/docs/storefront/catalog/overview.mdx b/content/docs/storefront/catalog/overview.mdx index 2177465f..0daf2c1b 100644 --- a/content/docs/storefront/catalog/overview.mdx +++ b/content/docs/storefront/catalog/overview.mdx @@ -3,8 +3,6 @@ title: Catalogs description: Catalogs are named bundles of categories and products that can be assigned to food trucks (and, soon, store locations) — distinct from the store's underlying product list. --- -# Catalogs - A **Catalog** is a named bundle of **categories** and **products** that you can assign to one or more **food trucks**. Catalogs are useful when one store runs multiple mobile units that serve different menus — the BBQ truck and the taco truck share a parent store but each has its own catalog. Catalogs are **distinct** from the store's underlying product list (which is sometimes loosely called "the catalog"). A catalog references existing products through pivot tables — it doesn't duplicate them. diff --git a/content/docs/storefront/catalog/pricing.mdx b/content/docs/storefront/catalog/pricing.mdx index a25712ee..597949f3 100644 --- a/content/docs/storefront/catalog/pricing.mdx +++ b/content/docs/storefront/catalog/pricing.mdx @@ -3,8 +3,6 @@ title: Pricing description: Configure base pricing, variant pricing, addon pricing, and sale prices for your Storefront products. --- -# Pricing - Storefront's pricing model is built around base prices with optional modifiers from variants and addons. There is also a sale price mechanism for time-limited discounts. ## Base Price diff --git a/content/docs/storefront/catalog/products.mdx b/content/docs/storefront/catalog/products.mdx index e4fd24c4..c38b3370 100644 --- a/content/docs/storefront/catalog/products.mdx +++ b/content/docs/storefront/catalog/products.mdx @@ -3,8 +3,6 @@ title: Products description: Create and manage products in your Storefront catalog — images, videos, variants, addons, availability, translations, and metadata. --- -# Products - A **Product** is the core unit of your catalog — any item or service a customer can purchase. Products belong to a specific store and are organized into categories. Navigate to **Storefront → Products** to manage your product list. diff --git a/content/docs/storefront/catalog/variants-and-addons.mdx b/content/docs/storefront/catalog/variants-and-addons.mdx index 6b7b336f..cefb6392 100644 --- a/content/docs/storefront/catalog/variants-and-addons.mdx +++ b/content/docs/storefront/catalog/variants-and-addons.mdx @@ -3,8 +3,6 @@ title: Variants & Addons description: Configure product variants (required selections like size/color) and addons (optional extras like toppings) for flexible ordering. --- -# Variants & Addons - Many products require customers to make choices before they can be added to the cart. Storefront handles this through two mechanisms: **Variants** (required selections) and **Addons** (optional extras). ## Variants diff --git a/content/docs/storefront/customers/authentication.mdx b/content/docs/storefront/customers/authentication.mdx index 05295b11..904938f5 100644 --- a/content/docs/storefront/customers/authentication.mdx +++ b/content/docs/storefront/customers/authentication.mdx @@ -3,8 +3,6 @@ title: Customer Authentication description: Configure customer authentication — SMS code, email/password, Apple, Google, and Facebook sign-in. The full registration, verification, and login flow with API examples. --- -# Customer Authentication - Storefront provides a complete authentication system for your customers. On successful authentication, the API returns a **Sanctum personal access token**. Your customer-facing app stores this token and includes it on every authenticated request via the **`Customer-Token`** header (the storefront key still goes in `Authorization: Bearer`). ```http diff --git a/content/docs/storefront/customers/overview.mdx b/content/docs/storefront/customers/overview.mdx index 82fb4e8b..1b69f18f 100644 --- a/content/docs/storefront/customers/overview.mdx +++ b/content/docs/storefront/customers/overview.mdx @@ -3,8 +3,6 @@ title: Customers description: Manage customer accounts in your store or network — order history, contact details, addresses, and the API surface for guest and registered customers. --- -# Customers - A **Customer** is an end-user registered with your store or network. Customer records track contact information, saved delivery addresses, order history, and API authentication tokens. Navigate to **Storefront → Customers** to manage your customer base. diff --git a/content/docs/storefront/getting-started/core-concepts.mdx b/content/docs/storefront/getting-started/core-concepts.mdx index a9501e91..61f8cb1e 100644 --- a/content/docs/storefront/getting-started/core-concepts.mdx +++ b/content/docs/storefront/getting-started/core-concepts.mdx @@ -3,8 +3,6 @@ title: Core Concepts description: Understand the key building blocks of Storefront — stores, networks, products, cart, checkout, customers, food trucks, catalogs, and how they integrate with Fleet-Ops. --- -# Core Concepts - Storefront is built on a small set of entities that work together to power the full commerce lifecycle — from product browsing to order fulfillment via Fleet-Ops. ## Store diff --git a/content/docs/storefront/getting-started/quickstart.mdx b/content/docs/storefront/getting-started/quickstart.mdx index 15b0b155..9f9e08f6 100644 --- a/content/docs/storefront/getting-started/quickstart.mdx +++ b/content/docs/storefront/getting-started/quickstart.mdx @@ -3,8 +3,6 @@ title: Quickstart description: Get your Storefront up and running — create a store, add a location, set up products, configure a payment gateway, and grab your API key. --- -# Quickstart - This guide walks you through setting up a Storefront store, adding a location and products, configuring a payment gateway, and grabbing your API key — all from the Fleetbase Console. ## Step 1 — Create a Store diff --git a/content/docs/storefront/networks/overview.mdx b/content/docs/storefront/networks/overview.mdx index 123d817c..4b8046f2 100644 --- a/content/docs/storefront/networks/overview.mdx +++ b/content/docs/storefront/networks/overview.mdx @@ -3,8 +3,6 @@ title: Networks description: Build a multi-vendor marketplace by grouping multiple Storefront stores into a Network — shared payment gateways, notification channels, and a single customer-facing app. --- -# Networks - A **Network** is a collection of Storefront stores grouped into a single marketplace. Networks are the right architecture when you are building a platform that hosts multiple independent merchants — food delivery apps, local marketplace aggregators, multi-brand parent companies. If you are running a single brand, you don't need a network — see [Stores](/docs/storefront/stores/overview). diff --git a/content/docs/storefront/orders/cart.mdx b/content/docs/storefront/orders/cart.mdx index 894cb182..abab0de4 100644 --- a/content/docs/storefront/orders/cart.mdx +++ b/content/docs/storefront/orders/cart.mdx @@ -3,8 +3,6 @@ title: Cart description: Persistent cart sessions, item structure, multi-store cart behavior, and the Cart API endpoints. --- -# Cart - The **Cart** is a persistent shopping session. Cart state is stored in the database, so customers can abandon and return without losing their selections. A cart's `expires_at` is set 7 days after creation and is not extended on subsequent updates. ## Cart Sessions diff --git a/content/docs/storefront/orders/checkout.mdx b/content/docs/storefront/orders/checkout.mdx index 282b5c3b..62f3d711 100644 --- a/content/docs/storefront/orders/checkout.mdx +++ b/content/docs/storefront/orders/checkout.mdx @@ -3,8 +3,6 @@ title: Checkout description: The Storefront checkout is a two-step API flow — `/checkouts/before` to initialize and produce a token, then `/checkouts/capture` to finalize the order after payment is confirmed. --- -# Checkout - **Checkout** converts a cart into a paid order. Storefront uses a **two-step** flow: 1. **`/checkouts/before`** — submit the cart, service quote, gateway, tip, and pickup/delivery flag. Storefront returns a **token** (and a Stripe `clientSecret` if the gateway is Stripe). diff --git a/content/docs/storefront/orders/overview.mdx b/content/docs/storefront/orders/overview.mdx index 183f55b6..127a0ab2 100644 --- a/content/docs/storefront/orders/overview.mdx +++ b/content/docs/storefront/orders/overview.mdx @@ -3,8 +3,6 @@ title: Orders & Checkout description: Manage the full Storefront order lifecycle — cart, two-step checkout, payment, Fleet-Ops fulfillment, and the transactional notifications that fire along the way. --- -# Orders & Checkout - The **Orders & Checkout** system handles the complete purchase lifecycle — from a customer adding items to their cart through to a dispatched Fleet-Ops delivery. Navigate to **Storefront → Orders** to view and manage orders. diff --git a/content/docs/storefront/orders/payment-gateways.mdx b/content/docs/storefront/orders/payment-gateways.mdx index 708329dd..af5d5652 100644 --- a/content/docs/storefront/orders/payment-gateways.mdx +++ b/content/docs/storefront/orders/payment-gateways.mdx @@ -3,8 +3,6 @@ title: Payment Gateways description: Configure payment gateways for Storefront — Stripe, Braintree, QPay, Manual, and Cash on Delivery. --- -# Payment Gateways - To accept payments, configure one or more **Payment Gateways** in your store or network settings. Storefront supports four gateway schemas, plus a separate Cash on Delivery toggle. Navigate to **Storefront → Settings → Gateways** to configure gateways. diff --git a/content/docs/storefront/orders/service-quotes.mdx b/content/docs/storefront/orders/service-quotes.mdx index 5e4637c9..14f77ffd 100644 --- a/content/docs/storefront/orders/service-quotes.mdx +++ b/content/docs/storefront/orders/service-quotes.mdx @@ -3,8 +3,6 @@ title: Service Quotes description: Storefront calls Fleet-Ops to compute the delivery fee for a cart — the result is a Service Quote that's passed into checkout. --- -# Service Quotes - A **Service Quote** is the calculated delivery fee for a cart. Before a customer can check out, your frontend asks Storefront to produce a quote based on the cart contents, the customer's delivery address, and the applicable Fleet-Ops Service Rate. The quote is then passed into [`/checkouts/before`](/docs/storefront/orders/checkout) so the order is created with the correct delivery fee. diff --git a/content/docs/storefront/promotions/push-notifications.mdx b/content/docs/storefront/promotions/push-notifications.mdx index 1bd77e9a..98270544 100644 --- a/content/docs/storefront/promotions/push-notifications.mdx +++ b/content/docs/storefront/promotions/push-notifications.mdx @@ -3,8 +3,6 @@ title: Push Notifications description: Send broadcast or targeted push notifications to your customers via APNs (iOS) and FCM (Android). --- -# Push Notifications - Push notifications let you re-engage customers and announce new products. Storefront's push engine supports **Apple Push Notification service (APNs)** for iOS and **Firebase Cloud Messaging (FCM)** for Android. ## Prerequisites diff --git a/content/docs/storefront/settings/api.mdx b/content/docs/storefront/settings/api.mdx index 364307ff..28ed9ba5 100644 --- a/content/docs/storefront/settings/api.mdx +++ b/content/docs/storefront/settings/api.mdx @@ -3,8 +3,6 @@ title: API Settings description: Your Storefront key authenticates public requests from your customer-facing app — pass it as a bearer token on every API call. --- -# API Settings - Every store and network in Storefront has a unique **public key** that authenticates requests from your customer-facing app (mobile or web). The key is passed as a bearer token in the standard HTTP `Authorization` header. Navigate to **Storefront → Settings → API** to view your store's key. diff --git a/content/docs/storefront/settings/gateways.mdx b/content/docs/storefront/settings/gateways.mdx index feef157e..f4d7cdad 100644 --- a/content/docs/storefront/settings/gateways.mdx +++ b/content/docs/storefront/settings/gateways.mdx @@ -3,8 +3,6 @@ title: Gateway Settings description: Configure payment gateways for your store or network — Stripe, Braintree, QPay, Manual, and Cash on Delivery. --- -# Gateway Settings - **Gateways** are the payment processors your store uses to accept payments at checkout. Configure gateways in **Storefront → Settings → Gateways**. Gateways can be configured at the **store level** (applies to one store) or the **network level** (applies to all stores in the network). diff --git a/content/docs/storefront/settings/locations.mdx b/content/docs/storefront/settings/locations.mdx index d5f789ba..32121ef4 100644 --- a/content/docs/storefront/settings/locations.mdx +++ b/content/docs/storefront/settings/locations.mdx @@ -3,8 +3,6 @@ title: Location Settings description: Manage your active store's pickup locations and per-location operating hours. --- -# Location Settings - The **Locations** settings page is where you add, edit, and remove the **pickup addresses** for the currently active store. It is also where you set per-location **operating hours**. Navigate to **Storefront → Settings → Locations**. Make sure the correct store is selected via the store switcher first — every location you create here belongs to the active store. diff --git a/content/docs/storefront/settings/notifications.mdx b/content/docs/storefront/settings/notifications.mdx index 99c8de3d..da170226 100644 --- a/content/docs/storefront/settings/notifications.mdx +++ b/content/docs/storefront/settings/notifications.mdx @@ -3,8 +3,6 @@ title: Notification Settings description: Configure APNs and FCM notification channels so Storefront can deliver push notifications to your customers. --- -# Notification Settings - **Notification channels** connect Storefront to Apple Push Notification service (APNs) or Firebase Cloud Messaging (FCM) so you can deliver push notifications to your customers' devices. Navigate to **Storefront → Settings → Notifications** to manage channels. diff --git a/content/docs/storefront/stores/food-trucks.mdx b/content/docs/storefront/stores/food-trucks.mdx index 40692f9b..e75413a2 100644 --- a/content/docs/storefront/stores/food-trucks.mdx +++ b/content/docs/storefront/stores/food-trucks.mdx @@ -3,8 +3,6 @@ title: Food Trucks description: Configure mobile store locations — food trucks and pop-up shops linked to Fleet-Ops vehicles for live GPS positioning, with multi-catalog assignment. --- -# Food Trucks - Storefront supports **mobile stores** — food trucks, pop-up shops, and any merchant whose location changes day to day. A **FoodTruck** is its own entity that links a store to a Fleet-Ops **Vehicle** for live GPS positioning, and to one or more **Catalogs** for menu management. Navigate to **Storefront → Food Trucks** to manage mobile stores. diff --git a/content/docs/storefront/stores/operating-hours.mdx b/content/docs/storefront/stores/operating-hours.mdx index 57503314..31eeb768 100644 --- a/content/docs/storefront/stores/operating-hours.mdx +++ b/content/docs/storefront/stores/operating-hours.mdx @@ -3,8 +3,6 @@ title: Operating Hours description: Set per-location availability windows — customers cannot place orders outside operating hours. --- -# Operating Hours - **Operating Hours** define when a store location accepts orders. Hours are set **per location** (not per store) using the schedule manager on the location's edit panel. Each store has a `timezone` field — operating hours are evaluated against this timezone, not the customer's local time or the server's UTC clock. Set the store's timezone correctly before configuring hours. diff --git a/content/docs/storefront/stores/overview.mdx b/content/docs/storefront/stores/overview.mdx index 07e63901..c3c2b6b0 100644 --- a/content/docs/storefront/stores/overview.mdx +++ b/content/docs/storefront/stores/overview.mdx @@ -3,8 +3,6 @@ title: Stores description: A Store is a single brand or merchant in Storefront — its own catalog, locations, hours, payment gateways, and API key. --- -# Stores - A **Store** represents a single brand or merchant in Storefront. Every store has: - Its own **product catalog** (products and categories) diff --git a/content/docs/storefront/stores/setup.mdx b/content/docs/storefront/stores/setup.mdx index 9b9cdc1c..8e66864d 100644 --- a/content/docs/storefront/stores/setup.mdx +++ b/content/docs/storefront/stores/setup.mdx @@ -3,8 +3,6 @@ title: Creating a Store description: Create and configure an individual Storefront store — basic details, branding, contact info, and store-level settings. --- -# Creating a Store - This guide covers creating and configuring a single store. For multi-vendor marketplaces, see [Networks](/docs/storefront/networks/overview). ## Creating a Store diff --git a/content/docs/storefront/stores/store-locations.mdx b/content/docs/storefront/stores/store-locations.mdx index 421ea8eb..c101d9be 100644 --- a/content/docs/storefront/stores/store-locations.mdx +++ b/content/docs/storefront/stores/store-locations.mdx @@ -3,8 +3,6 @@ title: Store Locations description: Add physical locations to your store — used as pickup addresses for Fleet-Ops delivery orders. --- -# Store Locations - A **Store Location** is the physical address of a store. When a customer places an order, the location address becomes the **pickup address** in the Fleet-Ops order — the point where the driver collects the items for delivery. A single store can have multiple locations (e.g., a franchise with five branches). Locations are managed centrally for the active store under **Storefront → Settings → Locations**. diff --git a/content/docs/ui/actions/button.mdx b/content/docs/ui/actions/button.mdx index a6a5360b..5737924c 100644 --- a/content/docs/ui/actions/button.mdx +++ b/content/docs/ui/actions/button.mdx @@ -3,8 +3,6 @@ title: Button description: "<Button> is the standard button component. Supports types, sizes, icons, loading state, permission gating, tooltips, and analytics events." --- -# `<Button>` - The standard button used everywhere in the Fleetbase Console. Supports semantic types, sizes, icons, loading state, built-in permission checks, tooltips, and analytics events. ## Basic Usage diff --git a/content/docs/ui/actions/click-to-copy.mdx b/content/docs/ui/actions/click-to-copy.mdx index 80fc24f8..67390a94 100644 --- a/content/docs/ui/actions/click-to-copy.mdx +++ b/content/docs/ui/actions/click-to-copy.mdx @@ -3,8 +3,6 @@ title: ClickToCopy description: "<ClickToCopy> wraps any value with a one-click copy-to-clipboard interaction. Hover shows a tooltip; click copies." --- -# `<ClickToCopy>` - Wraps any value with a one-click copy-to-clipboard action. Hovering shows a "Click to copy" tooltip; clicking copies the value and the tooltip flips to "Copied!". Used everywhere a user might need to grab an ID, public key, or generated token — auto-generated public IDs in tables, API keys in settings, gateway transaction references in audit logs. diff --git a/content/docs/ui/actions/click-to-reveal.mdx b/content/docs/ui/actions/click-to-reveal.mdx index 51e02aa0..e49e0aa3 100644 --- a/content/docs/ui/actions/click-to-reveal.mdx +++ b/content/docs/ui/actions/click-to-reveal.mdx @@ -3,8 +3,6 @@ title: ClickToReveal description: "<ClickToReveal> blurs a sensitive value (API key, password, token) until the user clicks 'Click to reveal'. Optionally enables click-to-copy after reveal." --- -# `<ClickToReveal>` - Renders a value that's **blurred by default** with a "Click to reveal" button overlay. Used for sensitive values like API keys, secret tokens, webhook signing secrets — values you want visible only on demand. Extends [`<ClickToCopy>`](/docs/ui/actions/click-to-copy) — once revealed, the wrapper can also act as a click-to-copy target. diff --git a/content/docs/ui/builders/report-builder.mdx b/content/docs/ui/builders/report-builder.mdx index a6314431..eb882d92 100644 --- a/content/docs/ui/builders/report-builder.mdx +++ b/content/docs/ui/builders/report-builder.mdx @@ -3,8 +3,6 @@ title: ReportBuilder description: "<ReportBuilder> is a visual query builder for constructing reports — pick tables, columns, filters, sorts, and group-bys, then preview live results." --- -# `<ReportBuilder>` - `<ReportBuilder>` is a visual query builder for constructing custom reports. The user picks tables and columns, applies filters and sorts, and previews the resulting data live. The configuration is persisted as a `query_config` JSON object on a Report record. ## Basic Usage diff --git a/content/docs/ui/builders/template-builder.mdx b/content/docs/ui/builders/template-builder.mdx index d6231ad6..3d637918 100644 --- a/content/docs/ui/builders/template-builder.mdx +++ b/content/docs/ui/builders/template-builder.mdx @@ -3,8 +3,6 @@ title: TemplateBuilder description: "<TemplateBuilder> is a drag-and-drop layout editor for HTML templates with variable interpolation. Used by Ledger invoice templates and any template-driven feature." --- -# `<TemplateBuilder>` - `<TemplateBuilder>` is a complete drag-and-drop editor for designing templates that mix static layout with dynamic variables. It's the engine behind Ledger's invoice templates and is reusable for any template-driven feature. The builder supports text, images, tables, lines, shapes, QR codes, and barcodes — each freely positioned, rotated, and styled. Variables (e.g. `{invoice.number}`, `{transaction.reference}`) are inserted via a variable picker that's powered by **context schemas** registered with the template render service. diff --git a/content/docs/ui/dashboard/overview.mdx b/content/docs/ui/dashboard/overview.mdx index 529f3985..31d2609e 100644 --- a/content/docs/ui/dashboard/overview.mdx +++ b/content/docs/ui/dashboard/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: How dashboards work in @fleetbase/ember-ui — the dashboard service, widgets, and widget registries. --- -# Dashboards - `@fleetbase/ember-ui` ships a complete dashboard subsystem — a [`dashboard` service](/docs/ui/dashboard/service) for managing dashboards, a `<Dashboard>` component for rendering them, plus stat widgets and a Universe-backed widget registry that lets extensions contribute widgets to each other. Most extension authors don't render `<Dashboard>` directly — the console hosts a dashboard page for each extension that supports them, driven by the service. @@ -103,7 +101,7 @@ See real examples: - [Dashboard Service](/docs/ui/dashboard/service) — full API - [Registry & Slots](/docs/ui/registry/overview) — the broader registration model -- [Universe](/docs/extension-development/universe) — the underlying registry system +- [Universe](/docs/extension-development/universe/overview) — the underlying registry system ## Source diff --git a/content/docs/ui/dashboard/service.mdx b/content/docs/ui/dashboard/service.mdx index c7a89600..8a4912c2 100644 --- a/content/docs/ui/dashboard/service.mdx +++ b/content/docs/ui/dashboard/service.mdx @@ -3,8 +3,6 @@ title: Dashboard Service description: "The `dashboard` service manages an extension's dashboards — load, switch, create, delete — and tracks edit state and widget panels." --- -# Dashboard Service - ```js @service dashboard; ``` diff --git a/content/docs/ui/display/activity-log.mdx b/content/docs/ui/display/activity-log.mdx index 236d6155..e469db9e 100644 --- a/content/docs/ui/display/activity-log.mdx +++ b/content/docs/ui/display/activity-log.mdx @@ -3,8 +3,6 @@ title: ActivityLog description: "<ActivityLog> renders a compact activity timeline — auto-fetches from the `activity` model, supports date-range filtering, and previews changed attributes." --- -# `<ActivityLog>` - `<ActivityLog>` renders a compact timeline of activity records (user and system actions). It auto-fetches activities from the `activity` Ember Data model, displays relative timestamps, and summarizes creates, deletes, and changed attributes in a sentence-style feed. When an activity changes more than one attribute, the attribute count opens a hover popover with the changed fields and their previous/new values. diff --git a/content/docs/ui/display/badge.mdx b/content/docs/ui/display/badge.mdx index 6ee92a48..429b92e9 100644 --- a/content/docs/ui/display/badge.mdx +++ b/content/docs/ui/display/badge.mdx @@ -3,8 +3,6 @@ title: Badge description: "<Badge> is a small status pill — used everywhere to show order statuses, account states, and categorical labels." --- -# `<Badge>` - `<Badge>` renders a colored pill with a status dot and a label. It's the canonical way to display: - Order statuses (`created`, `dispatched`, `completed`, `canceled`) diff --git a/content/docs/ui/display/comment-thread.mdx b/content/docs/ui/display/comment-thread.mdx index de31256d..4a35077d 100644 --- a/content/docs/ui/display/comment-thread.mdx +++ b/content/docs/ui/display/comment-thread.mdx @@ -3,8 +3,6 @@ title: CommentThread description: "<CommentThread> renders a comment input + thread of existing comments for a resource. Persists via the `comment` Ember Data model." --- -# `<CommentThread>` - `<CommentThread>` renders a textarea for posting new comments plus a thread of existing comments. Comments persist via the `comment` Ember Data model and are scoped to the subject record you pass in. ## Basic Usage diff --git a/content/docs/ui/display/file.mdx b/content/docs/ui/display/file.mdx index 3d84fd7c..a94a6b87 100644 --- a/content/docs/ui/display/file.mdx +++ b/content/docs/ui/display/file.mdx @@ -3,8 +3,6 @@ title: File description: "<File> renders a file card with preview (image thumbnail or icon), filename, and an optional actions dropdown. Pair with <FileIcon> for inline icons." --- -# `<File>` - `<File>` renders a card-style preview of a Fleetbase `file` record. It shows the image thumbnail (for images) or a file-type icon (for everything else), the truncated filename, and an optional actions dropdown with delete/download/preview entries. For a smaller inline icon, use `<FileIcon>`. diff --git a/content/docs/ui/display/pill.mdx b/content/docs/ui/display/pill.mdx index 47665761..1ba77c21 100644 --- a/content/docs/ui/display/pill.mdx +++ b/content/docs/ui/display/pill.mdx @@ -3,8 +3,6 @@ title: Pill description: "<Pill> renders an avatar + name + optional subtitle for a Fleetbase resource — driver, customer, vehicle, etc. Optional online indicator and tooltip." --- -# `<Pill>` - `<Pill>` is a compact representation of a Fleetbase resource — typically used in lists, table cells, and assignment widgets. It shows the resource's image (with fallback), name, optional subtitle, and an online indicator if the resource has an `online` property. For categorical / status labels, use [`<Badge>`](/docs/ui/display/badge) instead. diff --git a/content/docs/ui/display/progress-bar.mdx b/content/docs/ui/display/progress-bar.mdx index b9f6d1b0..805dc5ea 100644 --- a/content/docs/ui/display/progress-bar.mdx +++ b/content/docs/ui/display/progress-bar.mdx @@ -3,8 +3,6 @@ title: ProgressBar description: "<ProgressBar> is a linear progress indicator with a title and percentage. Used for uploads, multi-step flows, and KPI completion." --- -# `<ProgressBar>` - A simple linear progress indicator with a title on the left and a percentage on the right. ## Basic Usage diff --git a/content/docs/ui/display/spinner.mdx b/content/docs/ui/display/spinner.mdx index aee2f035..26c37d4c 100644 --- a/content/docs/ui/display/spinner.mdx +++ b/content/docs/ui/display/spinner.mdx @@ -3,8 +3,6 @@ title: Spinner description: "<Spinner> shows a small loading indicator. Used inside buttons, panels, and lists while async work is in flight." --- -# `<Spinner>` - A simple loading spinner. Use it inside buttons, panel headers, list rows, or anywhere you need to indicate pending work. `<Button>` already shows a spinner internally when you pass `@isLoading={{true}}` — you usually don't need `<Spinner>` directly inside buttons. diff --git a/content/docs/ui/display/table.mdx b/content/docs/ui/display/table.mdx index 9df83464..33a08e08 100644 --- a/content/docs/ui/display/table.mdx +++ b/content/docs/ui/display/table.mdx @@ -3,8 +3,6 @@ title: Table description: "<Table> is the standard data table component — sortable, resizable, selectable, expandable, with pagination support and pluggable cell components." --- -# `<Table>` - `<Table>` is the standard data table for resource lists. It supports sortable columns, resizable columns, row selection (single and bulk), expandable rows, custom cell components, and pagination. For full resource pages with search, filters, and bulk actions, prefer [`<Layout::Resource::Tabular>`](/docs/ui/layout/resource-tabular) — it's a higher-level wrapper around `<Table>`. diff --git a/content/docs/ui/display/timeline.mdx b/content/docs/ui/display/timeline.mdx index 03da1460..16b86a45 100644 --- a/content/docs/ui/display/timeline.mdx +++ b/content/docs/ui/display/timeline.mdx @@ -3,8 +3,6 @@ title: Timeline description: "<Timeline> renders a horizontal timeline of activities with navigation arrows. Yields a curried <Timeline::Item> component to compose each entry." --- -# `<Timeline>` - `<Timeline>` renders a horizontal scrolling timeline of activities. The user navigates with left/right arrow buttons. Each visible activity is yielded as a curried `<Timeline::Item>` component for you to compose. ## Basic Usage diff --git a/content/docs/ui/getting-started/core-concepts.mdx b/content/docs/ui/getting-started/core-concepts.mdx index 7603ef24..682e27c7 100644 --- a/content/docs/ui/getting-started/core-concepts.mdx +++ b/content/docs/ui/getting-started/core-concepts.mdx @@ -3,8 +3,6 @@ title: Core Concepts description: How ember-ui is structured — components, helpers, modifiers, services, and the conventions that make every Fleetbase extension feel native. --- -# Core Concepts - `@fleetbase/ember-ui` is a standard Ember addon. If you're new to Ember, the four concepts below are the only ones you need before reading the rest of this section. ## Components diff --git a/content/docs/ui/getting-started/installation.mdx b/content/docs/ui/getting-started/installation.mdx index 37647a03..88f8867f 100644 --- a/content/docs/ui/getting-started/installation.mdx +++ b/content/docs/ui/getting-started/installation.mdx @@ -3,8 +3,6 @@ title: Installation description: "@fleetbase/ember-ui is bundled into every Fleetbase extension by default — this page covers what's installed automatically and how to add it manually if needed." --- -# Installation - In nearly every case **you don't need to install `@fleetbase/ember-ui` manually**. Every extension scaffolded with [`flb scaffold`](/docs/cli/extension-development/scaffold) already includes the library as a dependency, alongside the engine wiring needed to load it. ```jsonc diff --git a/content/docs/ui/helpers/data.mdx b/content/docs/ui/helpers/data.mdx index 8121f157..cee245b4 100644 --- a/content/docs/ui/helpers/data.mdx +++ b/content/docs/ui/helpers/data.mdx @@ -3,8 +3,6 @@ title: Data & Utility Helpers description: Helpers for data manipulation, model access, navigation, and general utility — get-dot-prop, set-model-attr, json-stringify, transition-to, and many more. --- -# Data & Utility Helpers - This page covers the rest of the helper library — data manipulation, model access, navigation, and miscellaneous utilities. ## Data Access diff --git a/content/docs/ui/helpers/formatting.mdx b/content/docs/ui/helpers/formatting.mdx index 039614f5..b4400896 100644 --- a/content/docs/ui/helpers/formatting.mdx +++ b/content/docs/ui/helpers/formatting.mdx @@ -3,8 +3,6 @@ title: Formatting Helpers description: Helpers for formatting bytes, currency, dates, durations, distances, file names, and humanizing strings. --- -# Formatting Helpers - These helpers convert raw values into display-ready strings. All are globally available in any template — no import needed. ## `{{format-bytes value}}` diff --git a/content/docs/ui/helpers/modifiers.mdx b/content/docs/ui/helpers/modifiers.mdx index 568668ec..271b5b8b 100644 --- a/content/docs/ui/helpers/modifiers.mdx +++ b/content/docs/ui/helpers/modifiers.mdx @@ -3,8 +3,6 @@ title: Modifiers description: Element modifiers from @fleetbase/ember-ui — set-height, set-width, imask, background-url, fallback-img-src, and more. --- -# Modifiers - Modifiers attach behavior to an element. They look like helpers but apply to the element rather than producing a value: ```handlebars diff --git a/content/docs/ui/helpers/permissions.mdx b/content/docs/ui/helpers/permissions.mdx index ee8e6e73..6893236d 100644 --- a/content/docs/ui/helpers/permissions.mdx +++ b/content/docs/ui/helpers/permissions.mdx @@ -3,8 +3,6 @@ title: Permission Helpers description: Helpers for conditional rendering based on IAM permissions — can-action, cannot-action, can-delete, can-write, and friends. --- -# Permission Helpers - These helpers wrap [`ember-can`](https://github.com/minutebase/ember-can) abilities to make permission gating concise in templates. They are pure functions — passing them stale arguments returns stale answers, so write the ability string inline rather than computing it externally. For declarative gating on individual components, prefer the built-in `@permission` arg on `<Button>`, `<ContentPanel>`, `<Toggle>`, etc. Use these helpers when the component itself doesn't accept `@permission` or when you need to gate arbitrary markup. diff --git a/content/docs/ui/helpers/type-checking.mdx b/content/docs/ui/helpers/type-checking.mdx index c3b1d30b..dd15c0f3 100644 --- a/content/docs/ui/helpers/type-checking.mdx +++ b/content/docs/ui/helpers/type-checking.mdx @@ -3,8 +3,6 @@ title: Type Checking Helpers description: Helpers for inspecting and asserting on values — is-array, is-model, is-url, is-uuid, in-array, is-object-empty, is-dark-mode, and more. --- -# Type Checking Helpers - These helpers return booleans describing a value's shape or contents. Useful for `{{#if}}` branches in templates. ## `{{is-array value}}` diff --git a/content/docs/ui/inputs/checkbox.mdx b/content/docs/ui/inputs/checkbox.mdx index 37e9aa9e..c8b224ef 100644 --- a/content/docs/ui/inputs/checkbox.mdx +++ b/content/docs/ui/inputs/checkbox.mdx @@ -3,8 +3,6 @@ title: Checkbox description: "<Checkbox> is the standard boolean checkbox. Supports labels, permission gating, help text, and a yielded block for rich label content." --- -# `<Checkbox>` - The standard checkbox for boolean inputs. Use this when you need a checkbox specifically — for an on/off switch, prefer [`<Toggle>`](/docs/ui/inputs/toggle). ## Basic Usage diff --git a/content/docs/ui/inputs/combo-box.mdx b/content/docs/ui/inputs/combo-box.mdx index 5f6b8bf8..5fcdcc0d 100644 --- a/content/docs/ui/inputs/combo-box.mdx +++ b/content/docs/ui/inputs/combo-box.mdx @@ -3,8 +3,6 @@ title: ComboBox description: "<ComboBox> is a dual-list selector — left column shows available options, right column shows selected options, with arrow buttons to move items between." --- -# `<ComboBox>` - `<ComboBox>` is a dual-list selector — sometimes called a "shuttle" or "transfer list". The left column lists available options, the right column lists selected options, and arrow buttons move items between the two. This is **not** the same pattern as a typeahead/autocomplete. For that, use [`<Select>`](/docs/ui/inputs/select), [`<ModelSelect>`](/docs/ui/inputs/model-select), or [`<MultiSelect>`](/docs/ui/inputs/multi-select). diff --git a/content/docs/ui/inputs/coordinates-input.mdx b/content/docs/ui/inputs/coordinates-input.mdx index 6eda4f9b..41ca5bb5 100644 --- a/content/docs/ui/inputs/coordinates-input.mdx +++ b/content/docs/ui/inputs/coordinates-input.mdx @@ -3,8 +3,6 @@ title: CoordinatesInput description: "<CoordinatesInput> renders side-by-side lat/lng fields with a map-picker dropdown that supports drag-to-place and address geocoding." --- -# `<CoordinatesInput>` - Lets a user enter or pick a geographic coordinate. Renders two text inputs (latitude and longitude) plus a "Select from map" dropdown that opens a Leaflet map with a draggable marker and an address-lookup field. For binding directly to an Ember Data record, see the sibling `<ModelCoordinatesInput>` (same component, but updates `record.location` automatically). diff --git a/content/docs/ui/inputs/date-picker.mdx b/content/docs/ui/inputs/date-picker.mdx index e9de5923..b77233b2 100644 --- a/content/docs/ui/inputs/date-picker.mdx +++ b/content/docs/ui/inputs/date-picker.mdx @@ -3,8 +3,6 @@ title: DatePicker description: "<DatePicker> is the calendar date picker — wraps `air-datepicker`. Accepts the full air-datepicker option set plus Fleetbase-friendly callbacks." --- -# `<DatePicker>` - A calendar-based date picker. Internally wraps the [`air-datepicker`](https://air-datepicker.com) library — every air-datepicker option is supported as an `@`-arg. For combined date + time inputs, use [`<DateTimeInput>`](/docs/ui/inputs/date-time-input). diff --git a/content/docs/ui/inputs/date-time-input.mdx b/content/docs/ui/inputs/date-time-input.mdx index 94ef68d4..4b056f22 100644 --- a/content/docs/ui/inputs/date-time-input.mdx +++ b/content/docs/ui/inputs/date-time-input.mdx @@ -3,8 +3,6 @@ title: DateTimeInput description: "<DateTimeInput> is a combined HTML date + time picker. Renders side-by-side native inputs and emits a JavaScript Date on change." --- -# `<DateTimeInput>` - A simple combined date + time input. Renders two side-by-side native HTML inputs (`<input type="date">` and `<input type="time">`) and emits a `Date` instance whenever either changes. For a calendar-style picker, use [`<DatePicker>`](/docs/ui/inputs/date-picker). diff --git a/content/docs/ui/inputs/file-upload.mdx b/content/docs/ui/inputs/file-upload.mdx index 20e0b162..75e9b3a2 100644 --- a/content/docs/ui/inputs/file-upload.mdx +++ b/content/docs/ui/inputs/file-upload.mdx @@ -3,8 +3,6 @@ title: FileUpload description: "<FileUpload> wraps `ember-file-upload`'s file-queue helper for triggered uploads. Yields the queue so you can compose any trigger UI. Pair with <UploadButton> for a ready-made trigger." --- -# `<FileUpload>` - `<FileUpload>` is a thin wrapper around `ember-file-upload`'s file-queue helper. It exposes a hidden file input and yields the queue so you can compose any trigger you like — a button, a panel, a drag area. For a ready-made button trigger, use [`<UploadButton>`](#upload-button) (covered below). diff --git a/content/docs/ui/inputs/input-group.mdx b/content/docs/ui/inputs/input-group.mdx index c208ecbe..9bc72369 100644 --- a/content/docs/ui/inputs/input-group.mdx +++ b/content/docs/ui/inputs/input-group.mdx @@ -3,8 +3,6 @@ title: InputGroup description: "<InputGroup> wraps a label, an input, and helper text into a single form field. The most-used component in @fleetbase/ember-ui — every form is built from these." --- -# `<InputGroup>` - `<InputGroup>` is the canonical way to lay out a labeled form field. It renders a label, an input, optional help text, and supports any custom input via a yielded block. It is the most-used component in `@fleetbase/ember-ui` — practically every form in the Fleetbase Console is composed from these. diff --git a/content/docs/ui/inputs/model-coordinates-input.mdx b/content/docs/ui/inputs/model-coordinates-input.mdx index 9cf04289..8ab3213e 100644 --- a/content/docs/ui/inputs/model-coordinates-input.mdx +++ b/content/docs/ui/inputs/model-coordinates-input.mdx @@ -3,8 +3,6 @@ title: ModelCoordinatesInput description: "<ModelCoordinatesInput> wraps <CoordinatesInput> for binding directly to a Fleetbase Ember Data model — auto-updates the record's `location` property and reverse-geocodes the address into the model." --- -# `<ModelCoordinatesInput>` - `<ModelCoordinatesInput>` is a thin wrapper around [`<CoordinatesInput>`](/docs/ui/inputs/coordinates-input) that binds directly to an Ember Data record. When the user moves the map marker, the record's `location` property is updated and Fleetbase's reverse-geocoder fills in `street1`, `city`, `country`, etc. on the same record. Use this when you have a model with a GeoJSON `location` field — `Place`, `StoreLocation`, `Driver`, `FuelReport`, etc. — and want a single component to handle both the coordinate picker and the address auto-fill. diff --git a/content/docs/ui/inputs/model-select.mdx b/content/docs/ui/inputs/model-select.mdx index b37ffbb8..971d7d79 100644 --- a/content/docs/ui/inputs/model-select.mdx +++ b/content/docs/ui/inputs/model-select.mdx @@ -3,8 +3,6 @@ title: ModelSelect description: "<ModelSelect> is a typeahead select for Ember Data records — live-searches the registered store, supports infinite scroll, and accepts the full ember-power-select API." --- -# `<ModelSelect>` - `<ModelSelect>` is a typeahead select for Ember Data model records. It live-queries your registered store as the user types and supports infinite scroll. It is the standard way to let a user pick a driver, vehicle, customer, store, or any other Fleetbase resource. The component wraps `ember-power-select` and accepts that library's full API on top of its own arguments. diff --git a/content/docs/ui/inputs/money-input.mdx b/content/docs/ui/inputs/money-input.mdx index c3341414..273a109a 100644 --- a/content/docs/ui/inputs/money-input.mdx +++ b/content/docs/ui/inputs/money-input.mdx @@ -3,8 +3,6 @@ title: MoneyInput description: "<MoneyInput> is a currency-aware money input — formats as the user types using AutoNumeric and shows the currency symbol on the left. Optional currency picker." --- -# `<MoneyInput>` - A currency-aware money input. Formats as the user types using `AutoNumeric` and shows the active currency on the left. Optionally lets the user pick a different currency via a built-in dropdown. ## Basic Usage diff --git a/content/docs/ui/inputs/multi-select.mdx b/content/docs/ui/inputs/multi-select.mdx index 30156826..5c3ed972 100644 --- a/content/docs/ui/inputs/multi-select.mdx +++ b/content/docs/ui/inputs/multi-select.mdx @@ -3,8 +3,6 @@ title: MultiSelect description: "<MultiSelect> is a multi-value typeahead select. Thin wrapper around ember-power-select's PowerSelectMultiple." --- -# `<MultiSelect>` - A multi-value typeahead select. Thin wrapper around `ember-power-select`'s `<PowerSelectMultiple>` with Fleetbase's form styling. For Ember Data records, prefer [`<ModelSelectMultiple>`](/docs/ui/inputs/model-select). diff --git a/content/docs/ui/inputs/phone-input.mdx b/content/docs/ui/inputs/phone-input.mdx index 269aa140..54524a85 100644 --- a/content/docs/ui/inputs/phone-input.mdx +++ b/content/docs/ui/inputs/phone-input.mdx @@ -3,8 +3,6 @@ title: PhoneInput description: "<PhoneInput> wraps `intl-tel-input` for international phone numbers — auto-detects the user's country, formats as you type, and emits E.164." --- -# `<PhoneInput>` - International phone number input. Wraps the [`intl-tel-input`](https://github.com/jackocnr/intl-tel-input) library to provide a country selector, format-as-you-type, and emits the E.164 format on input. The user's country is auto-detected from their IP via Fleetbase's geolocation service (with US as the fallback). diff --git a/content/docs/ui/inputs/select.mdx b/content/docs/ui/inputs/select.mdx index 2e4d27d4..cfc2dbc8 100644 --- a/content/docs/ui/inputs/select.mdx +++ b/content/docs/ui/inputs/select.mdx @@ -3,8 +3,6 @@ title: Select description: "<Select> is the standard HTML-native single-value dropdown. Accepts an options array or hash, supports custom labels, value paths, humanization, and yielded option rendering." --- -# `<Select>` - `<Select>` is the standard single-value dropdown. It wraps a native `<select>` element with Fleetbase's form styling, plus convenience for option labels, value paths, and humanization. For an autocomplete / typeahead, use [`<ComboBox>`](/docs/ui/inputs/combo-box). For selecting a Fleetbase model record, use [`<ModelSelect>`](/docs/ui/inputs/model-select). diff --git a/content/docs/ui/inputs/toggle.mdx b/content/docs/ui/inputs/toggle.mdx index c610b86c..65b8e2cb 100644 --- a/content/docs/ui/inputs/toggle.mdx +++ b/content/docs/ui/inputs/toggle.mdx @@ -3,8 +3,6 @@ title: Toggle description: "<Toggle> is the on/off switch for boolean values. Supports labels, custom colors, permission gating, and a yielded block for inline content." --- -# `<Toggle>` - A switch-style on/off input for boolean values. Used everywhere a single boolean flag needs to be set — settings panels, feature flags, "Online" / "Active" toggles. ## Basic Usage diff --git a/content/docs/ui/inputs/unit-input.mdx b/content/docs/ui/inputs/unit-input.mdx index f71c07d5..326e9b55 100644 --- a/content/docs/ui/inputs/unit-input.mdx +++ b/content/docs/ui/inputs/unit-input.mdx @@ -3,8 +3,6 @@ title: UnitInput description: "<UnitInput> is a numeric input with an attached unit label or unit picker — used for weights, distances, capacities, and any measurement." --- -# `<UnitInput>` - A numeric input with a unit label fixed to its right. Optionally lets the user pick a different unit from a dropdown. Used for weights (`kg`, `lb`), distances (`km`, `mi`), capacities (`L`, `gal`), and similar measurement fields. diff --git a/content/docs/ui/layout/attach-popover.mdx b/content/docs/ui/layout/attach-popover.mdx index 39483c41..8376289f 100644 --- a/content/docs/ui/layout/attach-popover.mdx +++ b/content/docs/ui/layout/attach-popover.mdx @@ -3,8 +3,6 @@ title: Attach::Popover description: "<Attach::Popover> renders a floating layer attached to its parent — used for popovers, dropdown menus, and click-triggered floating UIs." --- -# `<Attach::Popover>` - `<Attach::Popover>` renders a floating layer attached to its parent element. Unlike `<Attach::Tooltip>` (which is configured for transient hover hints), the Popover is configured for richer interactions — click triggers, persistent visibility, and `@interactive` content the user can mouse into. It uses `<Floating>` under the hood for positioning. diff --git a/content/docs/ui/layout/attach-tooltip.mdx b/content/docs/ui/layout/attach-tooltip.mdx index b33655c2..ff57bf8c 100644 --- a/content/docs/ui/layout/attach-tooltip.mdx +++ b/content/docs/ui/layout/attach-tooltip.mdx @@ -3,8 +3,6 @@ title: Attach::Tooltip description: "<Attach::Tooltip> renders a tooltip attached to its parent element. Wraps <Attach::Popover> with tooltip-friendly defaults — hover/focus triggers, top placement, fade animation." --- -# `<Attach::Tooltip>` - `<Attach::Tooltip>` renders a tooltip floating layer attached to its parent element. It is a thin wrapper around [`<Attach::Popover>`](/docs/ui/layout/attach-popover) with sensible tooltip defaults — shows on `mouseenter focus`, hides on `mouseleave blur escapekey`, with `top` placement. This is the canonical tooltip primitive used throughout `@fleetbase/ember-ui`. Most other components (`<Button>`, `<ContentPanel>`, `<Toggle>`, etc.) have built-in tooltip behavior driven by their `@helpText` arg — under the hood they're rendering `<Attach::Tooltip>`. diff --git a/content/docs/ui/layout/content-panel.mdx b/content/docs/ui/layout/content-panel.mdx index e95db38d..b8e1111d 100644 --- a/content/docs/ui/layout/content-panel.mdx +++ b/content/docs/ui/layout/content-panel.mdx @@ -3,8 +3,6 @@ title: ContentPanel description: "<ContentPanel> is the canonical collapsible section used to organize forms, settings, and detail views. Supports titles, status badges, action buttons, and permission gating." --- -# `<ContentPanel>` - `<ContentPanel>` is the standard collapsible panel used to organize a page into discrete sections. Forms, settings groups, detail views, drawers — they all use ContentPanel. It's collapsible by default. Pass `@open={{true}}` to render expanded. diff --git a/content/docs/ui/layout/drawer.mdx b/content/docs/ui/layout/drawer.mdx index adcb2996..cf983b5f 100644 --- a/content/docs/ui/layout/drawer.mdx +++ b/content/docs/ui/layout/drawer.mdx @@ -3,8 +3,6 @@ title: Drawer description: "<Drawer> is a bottom-anchored, height-resizable panel — used for inline detail views, secondary editors, and tray-style UIs." --- -# `<Drawer>` - `<Drawer>` is a bottom-anchored panel with a draggable handle. The user can resize it vertically by dragging the gutter, and optionally double-click a notch to minimize. Used for inline detail views and tray-style UIs. For a full-screen-edge slide-out panel, use [`<Overlay>`](/docs/ui/layout/overlay). diff --git a/content/docs/ui/layout/floating.mdx b/content/docs/ui/layout/floating.mdx index 74fdb0c0..cae19d28 100644 --- a/content/docs/ui/layout/floating.mdx +++ b/content/docs/ui/layout/floating.mdx @@ -3,8 +3,6 @@ title: Floating description: "<Floating> renders content in a floating layer using @floating-ui — the lower-level positioning primitive behind <Attach::Tooltip>, <Attach::Popover>, and dropdowns." --- -# `<Floating>` - `<Floating>` is a low-level utility for rendering an element in a floating layer (typically a portal) and positioning it relative to a trigger. It's used internally by tooltips, popovers, and dropdowns — most extension authors won't reach for it directly, but it's available if you need a custom positioning solution. ## Basic Usage diff --git a/content/docs/ui/layout/overlay.mdx b/content/docs/ui/layout/overlay.mdx index 5a0ab685..69ff4ef0 100644 --- a/content/docs/ui/layout/overlay.mdx +++ b/content/docs/ui/layout/overlay.mdx @@ -3,8 +3,6 @@ title: Overlay description: "<Overlay> is a sliding panel that docks to the left/right/top/bottom of the screen. Used for slide-out detail views, side panels, and drawer-like UIs." --- -# `<Overlay>` - `<Overlay>` is a sliding panel that docks to one edge of the screen. It supports minimize / maximize / resize gestures and is the basis for most slide-out detail views in the Fleetbase Console. For modal dialogs (centered, dimmed background) use the [modals](/docs/ui/modals/overview) system instead. diff --git a/content/docs/ui/layout/overview.mdx b/content/docs/ui/layout/overview.mdx index 82049a3b..da1efacd 100644 --- a/content/docs/ui/layout/overview.mdx +++ b/content/docs/ui/layout/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: Top-level layout primitives in @fleetbase/ember-ui — Layout::Container, Layout::Header, Layout::Sidebar, Layout::Section, plus the standalone <Overlay>, <Drawer>, <ContentPanel>, and <Spacer>. --- -# Layout Overview - `@fleetbase/ember-ui` ships two complementary sets of layout primitives: 1. **Top-level scaffolding** — `<Layout::Container>`, `<Layout::Header>`, `<Layout::Sidebar>`, `<Layout::Section>`, `<Layout::Main>`. These compose the overall page chrome. diff --git a/content/docs/ui/layout/resource-tabular.mdx b/content/docs/ui/layout/resource-tabular.mdx index fa63f6c5..68746364 100644 --- a/content/docs/ui/layout/resource-tabular.mdx +++ b/content/docs/ui/layout/resource-tabular.mdx @@ -3,8 +3,6 @@ title: Resource Layouts description: "<Layout::Resource::Tabular>, <Layout::Resource::Card>, <Layout::Resource::CardsGrid>, and <Layout::Resource::Panel> — pre-built page layouts for resource list views." --- -# Resource Layouts - `@fleetbase/ember-ui` ships four pre-built page layouts for rendering a resource list. They are higher-level wrappers around `<Table>`, search, filters, bulk actions, and pagination — drop one in and you get a complete resource page. | Layout | Component | When to use | diff --git a/content/docs/ui/layout/spacer.mdx b/content/docs/ui/layout/spacer.mdx index 7968eccb..7efd18cc 100644 --- a/content/docs/ui/layout/spacer.mdx +++ b/content/docs/ui/layout/spacer.mdx @@ -3,8 +3,6 @@ title: Spacer description: "<Spacer> inserts a fixed-size empty box between layout elements. Any CSS dimension property you pass (height, width, padding, margin, etc.) is applied directly." --- -# `<Spacer>` - A simple utility for adding a fixed amount of empty space between elements. Every argument you pass is applied directly to the element's inline style — so anything that's a valid CSS property name maps through. ## Basic Usage diff --git a/content/docs/ui/modals/modal-layouts.mdx b/content/docs/ui/modals/modal-layouts.mdx index 85a38345..e846e825 100644 --- a/content/docs/ui/modals/modal-layouts.mdx +++ b/content/docs/ui/modals/modal-layouts.mdx @@ -3,8 +3,6 @@ title: Modal Layouts description: Pre-built modal layouts in @fleetbase/ember-ui — confirm, alert, prompt, bulk-action, progress, process, loading, and option-prompt. --- -# Modal Layouts - `@fleetbase/ember-ui` ships several pre-built modal layouts. You don't render these directly — you call them via the [`modals-manager`](/docs/ui/modals/modals-manager) service. Each is just a convenience wrapper around `modalsManager.show()` with a layout component preset. | Layout | Service method | Component | diff --git a/content/docs/ui/modals/modals-manager.mdx b/content/docs/ui/modals/modals-manager.mdx index e0159403..0e88e372 100644 --- a/content/docs/ui/modals/modals-manager.mdx +++ b/content/docs/ui/modals/modals-manager.mdx @@ -3,8 +3,6 @@ title: Modals Manager Service description: "The `modals-manager` service is the programmatic API for opening, stacking, and dismissing modals. Returns a Promise that resolves on confirm and rejects on decline." --- -# Modals Manager Service - ```js @service modalsManager; ``` diff --git a/content/docs/ui/modals/overview.mdx b/content/docs/ui/modals/overview.mdx index e484b6f8..92fec0a6 100644 --- a/content/docs/ui/modals/overview.mdx +++ b/content/docs/ui/modals/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: How modals work in @fleetbase/ember-ui — the modals-manager service, the built-in layouts, and how to build custom modal components. --- -# Modals - Modals in `@fleetbase/ember-ui` are driven by a single service — `modals-manager` — that mounts a component into a portal, manages a stack of nested modals, and exposes a Promise-based API. ## How They Work diff --git a/content/docs/ui/navigation/dropdown-button.mdx b/content/docs/ui/navigation/dropdown-button.mdx index e82c99bb..c7078b90 100644 --- a/content/docs/ui/navigation/dropdown-button.mdx +++ b/content/docs/ui/navigation/dropdown-button.mdx @@ -3,8 +3,6 @@ title: DropdownButton description: "<DropdownButton> is a button that opens a dropdown menu — used for action menus, bulk actions, and grouped controls. Accepts an items array or yields a custom dropdown body." --- -# `<DropdownButton>` - A button that opens a dropdown panel on click. Used for action menus ("More…"), grouped controls (bulk actions), and any UI where a primary trigger reveals a list of choices. ## Items-Based Usage diff --git a/content/docs/ui/navigation/tab-navigation.mdx b/content/docs/ui/navigation/tab-navigation.mdx index f60f1211..9a477dcb 100644 --- a/content/docs/ui/navigation/tab-navigation.mdx +++ b/content/docs/ui/navigation/tab-navigation.mdx @@ -3,8 +3,6 @@ title: TabNavigation description: "<TabNavigation> renders a tab strip — supports route-driven tabs (LinkTo), state-driven tabs, icons, badges, closable tabs, and an Add-tab button." --- -# `<TabNavigation>` - `<TabNavigation>` renders a tab strip with active state, icons, badges, and an optional content area. Tabs can be: - **Route-driven** — clicking a tab navigates via `LinkTo` diff --git a/content/docs/ui/navigation/tabs.mdx b/content/docs/ui/navigation/tabs.mdx index 06353411..454813aa 100644 --- a/content/docs/ui/navigation/tabs.mdx +++ b/content/docs/ui/navigation/tabs.mdx @@ -3,8 +3,6 @@ title: Tabs description: "<Tabs> is the lightweight tab container that yields a curried <Tab> subcomponent. Each <Tab> takes a @title and renders its body via Ember Wormhole into the shared content area." --- -# `<Tabs>` - `<Tabs>` is the lightweight tab container in `@fleetbase/ember-ui`. It yields a curried `<Tab>` subcomponent — each Tab has a `@title` and yields its body content into the shared tab-content area. For a richer, route-aware tab strip with icons, badges, closable tabs, and an Add-tab button, use [`<TabNavigation>`](/docs/ui/navigation/tab-navigation). diff --git a/content/docs/ui/registry/overview.mdx b/content/docs/ui/registry/overview.mdx index 8d214093..3bc509a7 100644 --- a/content/docs/ui/registry/overview.mdx +++ b/content/docs/ui/registry/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: How extensions contribute UI into each other — registries, slots, and the <RegistryYield> component. Driven by addon/extension.js. --- -# Registry & Slots - Fleetbase extensions are isolated by default — each one ships its own components, services, and routes. But many features are richer when extensions can plug UI into each other: - A payment-gateway extension contributing a configuration form into Ledger's gateway settings @@ -210,5 +208,5 @@ These open-source extensions all use `addon/extension.js` to register their cont ## See Also - [`<RegistryYield>`](/docs/ui/registry/registry-yield) — render registry contributions in templates -- [Universe](/docs/extension-development/universe) — the full Universe API reference +- [Universe](/docs/extension-development/universe/overview) — the full Universe API reference - [Extension Development](/docs/extension-development/getting-started/quickstart) — full extension authoring guide diff --git a/content/docs/ui/registry/registry-yield.mdx b/content/docs/ui/registry/registry-yield.mdx index 46ae698f..8fac587a 100644 --- a/content/docs/ui/registry/registry-yield.mdx +++ b/content/docs/ui/registry/registry-yield.mdx @@ -3,8 +3,6 @@ title: RegistryYield description: "<RegistryYield> renders contributions from other extensions — components or menu items — into a named slot. Drives extension-to-extension UI integration." --- -# `<RegistryYield>` - `<RegistryYield>` is the primary mechanism for letting one extension contribute UI into another. It iterates over items in a named registry (components or menu items) and yields each one for you to render. This is what makes Fleetbase extensible: a payment-gateway extension can register a button in Ledger's gateway settings; an analytics extension can register a chart in the Fleet-Ops dashboard; etc. — without either side knowing the other exists at compile time. diff --git a/content/docs/ui/scheduling/event-calendar.mdx b/content/docs/ui/scheduling/event-calendar.mdx index 67b08599..c457dfc2 100644 --- a/content/docs/ui/scheduling/event-calendar.mdx +++ b/content/docs/ui/scheduling/event-calendar.mdx @@ -3,8 +3,6 @@ title: EventCalendar / ScheduleCalendar description: "<EventCalendar> is a date-grid calendar; <ScheduleCalendar> is a resource-lane scheduler with drag-and-drop. Both yield blocks for custom item rendering." --- -# `<EventCalendar>` and `<ScheduleCalendar>` - Two scheduling components ship in `@fleetbase/ember-ui`: - **`<EventCalendar>`** — a lightweight calendar for displaying events on a date grid (month/week/day) diff --git a/content/docs/ui/scheduling/full-calendar.mdx b/content/docs/ui/scheduling/full-calendar.mdx index 0335dadf..99630762 100644 --- a/content/docs/ui/scheduling/full-calendar.mdx +++ b/content/docs/ui/scheduling/full-calendar.mdx @@ -3,8 +3,6 @@ title: FullCalendar description: "<FullCalendar> is a full-featured calendar component wrapping FullCalendar.io. Day/week/month/timeline views with drag-and-drop event editing." --- -# `<FullCalendar>` - `<FullCalendar>` wraps [FullCalendar.io](https://fullcalendar.io/) for rich calendar UIs — day, week, month, and timeline views with drag-and-drop, event resizing, and resources/lanes for assignment-style schedules. For driver-style schedules with resource lanes, the higher-level [`<ScheduleCalendar>`](/docs/ui/scheduling/event-calendar) is usually a better fit (it pre-configures FullCalendar for that pattern). diff --git a/content/docs/ui/scheduling/kanban.mdx b/content/docs/ui/scheduling/kanban.mdx index 8000b1bc..f26575bd 100644 --- a/content/docs/ui/scheduling/kanban.mdx +++ b/content/docs/ui/scheduling/kanban.mdx @@ -3,8 +3,6 @@ title: Kanban description: "<Kanban> is a draggable board component with configurable columns and item cards. Used for status pipelines, dispatch boards, and any column-based workflow." --- -# `<Kanban>` - `<Kanban>` is a board component with configurable columns and draggable item cards. Items move between columns by drag-and-drop. Used for status pipelines (`To Do` → `In Progress` → `Done`), dispatch boards, order workflow boards, and any column-based UI. ## Basic Usage diff --git a/content/docs/ui/services/overview.mdx b/content/docs/ui/services/overview.mdx index 0533c5d8..9826d5c0 100644 --- a/content/docs/ui/services/overview.mdx +++ b/content/docs/ui/services/overview.mdx @@ -3,8 +3,6 @@ title: Overview description: The six injectable services exported by @fleetbase/ember-ui — Modals Manager, Sidebar, Dashboard, Template Builder, Resource Context Panel, Leaflet. --- -# Services - `@fleetbase/ember-ui` exports six injectable Ember services. Inject them like any other Ember service: ```js diff --git a/content/docs/ui/services/resource-context-panel.mdx b/content/docs/ui/services/resource-context-panel.mdx index 83102159..9aaeb114 100644 --- a/content/docs/ui/services/resource-context-panel.mdx +++ b/content/docs/ui/services/resource-context-panel.mdx @@ -3,8 +3,6 @@ title: Resource Context Panel Service description: "The `resource-context-panel` service opens contextual detail overlays for any Fleetbase resource — single-content or tabbed, with route-sync and a stack of nested panels." --- -# Resource Context Panel Service - ```js @service resourceContextPanel; ``` diff --git a/content/docs/ui/services/sidebar.mdx b/content/docs/ui/services/sidebar.mdx index 6e4966cc..408d394e 100644 --- a/content/docs/ui/services/sidebar.mdx +++ b/content/docs/ui/services/sidebar.mdx @@ -3,8 +3,6 @@ title: Sidebar Service description: "The `sidebar` service controls the console sidebar's visibility (visible / minimized / hidden) and enabled state." --- -# Sidebar Service - ```js @service sidebar; ``` diff --git a/content/docs/ui/services/template-builder.mdx b/content/docs/ui/services/template-builder.mdx index 10866532..b082b50b 100644 --- a/content/docs/ui/services/template-builder.mdx +++ b/content/docs/ui/services/template-builder.mdx @@ -3,8 +3,6 @@ title: Template Builder Service description: "The `template-builder` service lets extensions register Fleetbase model classes as queryable resource types in the TemplateQuery form." --- -# Template Builder Service - ```js @service templateBuilder; ``` diff --git a/next.config.ts b/next.config.ts index ea7988b2..2e971d91 100644 --- a/next.config.ts +++ b/next.config.ts @@ -247,6 +247,32 @@ const nextConfig: NextConfig = { : []), ], }, + async headers() { + return [ + { + // Let the CDN serve blog pages the way it already serves docs. Next's + // ISR handles regeneration; this makes the shared cache hold the + // rendered page for an hour and keep serving it while it revalidates, + // so a reader never waits on a cold render. + source: '/blog/:path*', + headers: [ + { + key: 'Cache-Control', + value: 'public, s-maxage=3600, stale-while-revalidate=86400', + }, + ], + }, + { + source: '/blog', + headers: [ + { + key: 'Cache-Control', + value: 'public, s-maxage=3600, stale-while-revalidate=86400', + }, + ], + }, + ]; + }, async rewrites() { return [ { diff --git a/public/images/integrations/android.svg b/public/images/integrations/android.svg new file mode 100644 index 00000000..c11733a3 --- /dev/null +++ b/public/images/integrations/android.svg @@ -0,0 +1 @@ +<svg fill="#3DDC84" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Android \ No newline at end of file diff --git a/public/images/integrations/digitalocean.svg b/public/images/integrations/digitalocean.svg new file mode 100644 index 00000000..9d575029 --- /dev/null +++ b/public/images/integrations/digitalocean.svg @@ -0,0 +1 @@ +DigitalOcean \ No newline at end of file diff --git a/public/images/integrations/docker.svg b/public/images/integrations/docker.svg new file mode 100644 index 00000000..e68a6613 --- /dev/null +++ b/public/images/integrations/docker.svg @@ -0,0 +1 @@ +Docker \ No newline at end of file diff --git a/public/images/integrations/expo.svg b/public/images/integrations/expo.svg new file mode 100644 index 00000000..c6222067 --- /dev/null +++ b/public/images/integrations/expo.svg @@ -0,0 +1 @@ +Expo \ No newline at end of file diff --git a/public/images/integrations/googlemaps.svg b/public/images/integrations/googlemaps.svg new file mode 100644 index 00000000..2c928cd7 --- /dev/null +++ b/public/images/integrations/googlemaps.svg @@ -0,0 +1 @@ +Google Maps \ No newline at end of file diff --git a/public/images/integrations/kubernetes.svg b/public/images/integrations/kubernetes.svg new file mode 100644 index 00000000..b2dded3a --- /dev/null +++ b/public/images/integrations/kubernetes.svg @@ -0,0 +1 @@ +Kubernetes \ No newline at end of file diff --git a/public/images/integrations/laravel.svg b/public/images/integrations/laravel.svg new file mode 100644 index 00000000..36f0035a --- /dev/null +++ b/public/images/integrations/laravel.svg @@ -0,0 +1 @@ +Laravel \ No newline at end of file diff --git a/public/images/integrations/mailgun.svg b/public/images/integrations/mailgun.svg new file mode 100644 index 00000000..e18cc4a2 --- /dev/null +++ b/public/images/integrations/mailgun.svg @@ -0,0 +1 @@ +Mailgun \ No newline at end of file diff --git a/public/images/integrations/mysql.svg b/public/images/integrations/mysql.svg new file mode 100644 index 00000000..0948dc48 --- /dev/null +++ b/public/images/integrations/mysql.svg @@ -0,0 +1 @@ +MySQL \ No newline at end of file diff --git a/public/images/integrations/nextdotjs.svg b/public/images/integrations/nextdotjs.svg new file mode 100644 index 00000000..42e365b4 --- /dev/null +++ b/public/images/integrations/nextdotjs.svg @@ -0,0 +1 @@ +Next.js \ No newline at end of file diff --git a/public/images/integrations/nodedotjs.svg b/public/images/integrations/nodedotjs.svg new file mode 100644 index 00000000..3cc5893e --- /dev/null +++ b/public/images/integrations/nodedotjs.svg @@ -0,0 +1 @@ +Node.js \ No newline at end of file diff --git a/public/images/integrations/openstreetmap.svg b/public/images/integrations/openstreetmap.svg new file mode 100644 index 00000000..81f205af --- /dev/null +++ b/public/images/integrations/openstreetmap.svg @@ -0,0 +1 @@ +OpenStreetMap \ No newline at end of file diff --git a/public/images/integrations/php.svg b/public/images/integrations/php.svg new file mode 100644 index 00000000..92bdc7de --- /dev/null +++ b/public/images/integrations/php.svg @@ -0,0 +1 @@ +PHP \ No newline at end of file diff --git a/public/images/integrations/react.svg b/public/images/integrations/react.svg new file mode 100644 index 00000000..88b9c771 --- /dev/null +++ b/public/images/integrations/react.svg @@ -0,0 +1 @@ +React \ No newline at end of file diff --git a/public/images/integrations/redis.svg b/public/images/integrations/redis.svg new file mode 100644 index 00000000..61480c93 --- /dev/null +++ b/public/images/integrations/redis.svg @@ -0,0 +1 @@ +Redis \ No newline at end of file diff --git a/public/images/integrations/sentry.svg b/public/images/integrations/sentry.svg new file mode 100644 index 00000000..47888975 --- /dev/null +++ b/public/images/integrations/sentry.svg @@ -0,0 +1 @@ +Sentry \ No newline at end of file diff --git a/public/images/integrations/shopify.svg b/public/images/integrations/shopify.svg new file mode 100644 index 00000000..525bd2b9 --- /dev/null +++ b/public/images/integrations/shopify.svg @@ -0,0 +1 @@ +Shopify \ No newline at end of file diff --git a/public/images/integrations/woocommerce.svg b/public/images/integrations/woocommerce.svg new file mode 100644 index 00000000..c98039ef --- /dev/null +++ b/public/images/integrations/woocommerce.svg @@ -0,0 +1 @@ +WooCommerce \ No newline at end of file diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx index deb80826..b56c4932 100644 --- a/src/app/blog/page.tsx +++ b/src/app/blog/page.tsx @@ -10,7 +10,7 @@ export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/blog' }, title: 'Blog', description: - 'Product updates, engineering deep-dives, logistics industry insights, and open-source news from the Fleetbase team. Stay up to date with the latest from the platform.', + 'Product updates, engineering deep-dives, logistics industry insight and open-source news from the team building Fleetbase.', keywords: [ 'fleetbase blog', 'logistics technology blog', diff --git a/src/app/compare/page.tsx b/src/app/compare/page.tsx index 9e0fa028..6100d86a 100644 --- a/src/app/compare/page.tsx +++ b/src/app/compare/page.tsx @@ -62,14 +62,10 @@ const COMPARISONS = [ 'Route4Me plans routes. Fleetbase does that and more — dispatch, driver management, real-time tracking, POD, WMS, storefront, and accounting in one open-source platform.', badge: null, }, - { - competitor: 'Bringg', - slug: 'vs-bringg', - tagline: 'Enterprise delivery management without enterprise pricing.', - description: - "Bringg targets large enterprises with custom pricing. Fleetbase gives you enterprise-grade fleet management and TMS for $29 a month plus $5 per driver or vehicle — or free if you self-host.", - badge: null, - }, + // Bringg intentionally omitted: /compare/vs-bringg currently redirects to + // this page, so the card linked visitors back to where they already were and + // cost a redirect hop in the crawl. The growth plan restores the page + // (GP-05), at which point this entry comes back. ]; export default function ComparePage() { diff --git a/src/app/developers/webhooks/page.tsx b/src/app/developers/webhooks/page.tsx index 34de3904..5474d2fc 100644 --- a/src/app/developers/webhooks/page.tsx +++ b/src/app/developers/webhooks/page.tsx @@ -3,7 +3,7 @@ import WebhooksPageContent from './webhooks-page-content'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/developers/webhooks' }, - title: 'Webhooks | Fleetbase Developer Platform', + title: 'Webhooks — Real-Time Event Delivery', description: 'Use Fleetbase webhooks to receive real-time event notifications for orders, drivers, tracking, and fleet activity in your systems.', keywords: 'fleetbase webhooks, order webhooks, real-time logistics events, delivery notifications, fleet webhook', openGraph: { diff --git a/src/app/oli-max/page.tsx b/src/app/oli-max/page.tsx index d1ebe09a..96e63f81 100644 --- a/src/app/oli-max/page.tsx +++ b/src/app/oli-max/page.tsx @@ -102,7 +102,7 @@ const stackParts = [ title: 'QPay — local payment rails', description: 'Native QPay integration via the Fleetbase payment gateway driver — Mongolia\'s most-used mobile-first checkout, no Western card friction.', - docs: '/docs/ledger/payments/gateways', + docs: '/docs/ledger/payments/gateways/overview', }, { icon: Compass, diff --git a/src/app/page.tsx b/src/app/page.tsx index 31f620f5..4f73964d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -6,6 +6,7 @@ import { OrganizationSchema, SoftwareApplicationSchema, WebSiteSchema } from '@/ import Hero from '@/components/sections/hero'; import PlatformModules from '@/components/sections/platform-modules'; import StatsBar from '@/components/sections/stats-bar'; +import SwitchingCallout from '@/components/sections/switching-callout'; // Below-the-fold sections — split into separate client bundles so the // initial homepage JS payload stays small. SSR remains on (default) so @@ -81,6 +82,7 @@ export default async function Home() { + ); diff --git a/src/app/platform/ai/page.tsx b/src/app/platform/ai/page.tsx index 071e70e8..06a5733f 100644 --- a/src/app/platform/ai/page.tsx +++ b/src/app/platform/ai/page.tsx @@ -7,6 +7,7 @@ import { } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; +import RelatedPages from '@/components/seo/related-pages'; const AI_REPO = 'https://github.com/fleetbase/ai'; @@ -561,6 +562,7 @@ export default function LogisticsAIPage() {
+
); } diff --git a/src/app/platform/developer-console/page.tsx b/src/app/platform/developer-console/page.tsx index 2e809c2b..9fb937f2 100644 --- a/src/app/platform/developer-console/page.tsx +++ b/src/app/platform/developer-console/page.tsx @@ -3,6 +3,7 @@ import type { Metadata } from 'next'; import { SoftwareApplicationSchema } from '@/components/seo/json-ld'; import DeveloperConsolePageContent from './console-page-content'; +import RelatedPages from '@/components/seo/related-pages'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/developer-console' }, @@ -42,6 +43,7 @@ export default function DeveloperConsolePage() { applicationCategory="DeveloperApplication" /> + ); } diff --git a/src/app/platform/extensions/extensions-page-content.tsx b/src/app/platform/extensions/extensions-page-content.tsx index c463efb2..c4d5f6cf 100644 --- a/src/app/platform/extensions/extensions-page-content.tsx +++ b/src/app/platform/extensions/extensions-page-content.tsx @@ -49,12 +49,15 @@ const categories = [ ]; // First-party + community-built integrations available natively or through -// extensions. Logos: simpleicons CDN where available, otherwise self-hosted +// extensions. Logos are all self-hosted under /images/integrations: four of +// them (sendgrid, microsoftazure, amazonaws, twilio) 404'd after Simple Icons +// renamed or dropped the slugs, and a sales page should not depend on a CDN +// for anything visible. // under /public/images/integrations/. const INTEGRATIONS: { name: string; category: string; logo: string }[] = [ // Maps & Location - { name: 'Google Maps', category: 'Maps & Location', logo: 'https://cdn.simpleicons.org/googlemaps/4285F4' }, - { name: 'OpenStreetMap', category: 'Maps & Location', logo: 'https://cdn.simpleicons.org/openstreetmap/7EBC6F' }, + { name: 'Google Maps', category: 'Maps & Location', logo: '/images/integrations/googlemaps.svg' }, + { name: 'OpenStreetMap', category: 'Maps & Location', logo: '/images/integrations/openstreetmap.svg' }, // Routing & Optimization { name: 'OSRM', category: 'Routing & Optimization', logo: '/images/integrations/osrm.svg' }, { name: 'Valhalla', category: 'Routing & Optimization', logo: '/images/integrations/valhalla.svg' }, @@ -64,38 +67,38 @@ const INTEGRATIONS: { name: string; category: string; logo: string }[] = [ { name: 'Samsara', category: 'Telematics & Fleet Hardware', logo: '/images/integrations/samsara.svg' }, { name: 'Geotab', category: 'Telematics & Fleet Hardware', logo: '/images/integrations/geotab.svg' }, // Payments - { name: 'Stripe', category: 'Payments', logo: 'https://cdn.simpleicons.org/stripe/635BFF' }, + { name: 'Stripe', category: 'Payments', logo: '/images/integrations/stripe.svg' }, // Communication - { name: 'Twilio', category: 'Communication', logo: 'https://cdn.simpleicons.org/twilio/F22F46' }, - { name: 'SendGrid', category: 'Communication', logo: 'https://cdn.simpleicons.org/sendgrid/51A9E3' }, - { name: 'Mailgun', category: 'Communication', logo: 'https://cdn.simpleicons.org/mailgun/F06B66' }, + { name: 'Twilio', category: 'Communication', logo: '/images/integrations/twilio.svg' }, + { name: 'SendGrid', category: 'Communication', logo: '/images/integrations/sendgrid.svg' }, + { name: 'Mailgun', category: 'Communication', logo: '/images/integrations/mailgun.svg' }, // Cloud & Infrastructure - { name: 'AWS', category: 'Cloud & Infrastructure', logo: 'https://cdn.simpleicons.org/amazonaws/FF9900' }, - { name: 'Google Cloud', category: 'Cloud & Infrastructure', logo: 'https://cdn.simpleicons.org/googlecloud/4285F4' }, - { name: 'Microsoft Azure', category: 'Cloud & Infrastructure', logo: 'https://cdn.simpleicons.org/microsoftazure/0078D4' }, - { name: 'DigitalOcean', category: 'Cloud & Infrastructure', logo: 'https://cdn.simpleicons.org/digitalocean/0080FF' }, - { name: 'Docker', category: 'Cloud & Infrastructure', logo: 'https://cdn.simpleicons.org/docker/2496ED' }, - { name: 'Kubernetes', category: 'Cloud & Infrastructure', logo: 'https://cdn.simpleicons.org/kubernetes/326CE5' }, + { name: 'AWS', category: 'Cloud & Infrastructure', logo: '/images/integrations/amazonaws.svg' }, + { name: 'Google Cloud', category: 'Cloud & Infrastructure', logo: '/images/integrations/googlecloud.svg' }, + { name: 'Microsoft Azure', category: 'Cloud & Infrastructure', logo: '/images/integrations/microsoftazure.svg' }, + { name: 'DigitalOcean', category: 'Cloud & Infrastructure', logo: '/images/integrations/digitalocean.svg' }, + { name: 'Docker', category: 'Cloud & Infrastructure', logo: '/images/integrations/docker.svg' }, + { name: 'Kubernetes', category: 'Cloud & Infrastructure', logo: '/images/integrations/kubernetes.svg' }, // Databases - { name: 'MySQL', category: 'Databases', logo: 'https://cdn.simpleicons.org/mysql/4479A1' }, - { name: 'Redis', category: 'Databases', logo: 'https://cdn.simpleicons.org/redis/DC382D' }, + { name: 'MySQL', category: 'Databases', logo: '/images/integrations/mysql.svg' }, + { name: 'Redis', category: 'Databases', logo: '/images/integrations/redis.svg' }, // Developer Tools - { name: 'GitHub', category: 'Developer Tools', logo: 'https://cdn.simpleicons.org/github/181717' }, - { name: 'Postman', category: 'Developer Tools', logo: 'https://cdn.simpleicons.org/postman/FF6C37' }, + { name: 'GitHub', category: 'Developer Tools', logo: '/images/integrations/github.svg' }, + { name: 'Postman', category: 'Developer Tools', logo: '/images/integrations/postman.svg' }, // Monitoring - { name: 'Sentry', category: 'Monitoring', logo: 'https://cdn.simpleicons.org/sentry/362D59' }, + { name: 'Sentry', category: 'Monitoring', logo: '/images/integrations/sentry.svg' }, // E-commerce - { name: 'Shopify', category: 'E-commerce', logo: 'https://cdn.simpleicons.org/shopify/96BF48' }, - { name: 'WooCommerce', category: 'E-commerce', logo: 'https://cdn.simpleicons.org/woocommerce/96588A' }, + { name: 'Shopify', category: 'E-commerce', logo: '/images/integrations/shopify.svg' }, + { name: 'WooCommerce', category: 'E-commerce', logo: '/images/integrations/woocommerce.svg' }, // Mobile - { name: 'Android', category: 'Mobile', logo: 'https://cdn.simpleicons.org/android/3DDC84' }, - { name: 'React Native', category: 'Mobile', logo: 'https://cdn.simpleicons.org/react/61DAFB' }, - { name: 'Expo', category: 'Mobile', logo: 'https://cdn.simpleicons.org/expo/000020' }, + { name: 'Android', category: 'Mobile', logo: '/images/integrations/android.svg' }, + { name: 'React Native', category: 'Mobile', logo: '/images/integrations/react.svg' }, + { name: 'Expo', category: 'Mobile', logo: '/images/integrations/expo.svg' }, // Backend & Framework - { name: 'Laravel', category: 'Backend & Framework', logo: 'https://cdn.simpleicons.org/laravel/FF2D20' }, - { name: 'Node.js', category: 'Backend & Framework', logo: 'https://cdn.simpleicons.org/nodedotjs/339933' }, - { name: 'Next.js', category: 'Backend & Framework', logo: 'https://cdn.simpleicons.org/nextdotjs/000000' }, - { name: 'PHP', category: 'Backend & Framework', logo: 'https://cdn.simpleicons.org/php/777BB4' }, + { name: 'Laravel', category: 'Backend & Framework', logo: '/images/integrations/laravel.svg' }, + { name: 'Node.js', category: 'Backend & Framework', logo: '/images/integrations/nodedotjs.svg' }, + { name: 'Next.js', category: 'Backend & Framework', logo: '/images/integrations/nextdotjs.svg' }, + { name: 'PHP', category: 'Backend & Framework', logo: '/images/integrations/php.svg' }, ]; const INTEGRATION_CATEGORIES = [...new Set(INTEGRATIONS.map((i) => i.category))]; diff --git a/src/app/platform/extensions/page.tsx b/src/app/platform/extensions/page.tsx index 14faf886..e16c7868 100644 --- a/src/app/platform/extensions/page.tsx +++ b/src/app/platform/extensions/page.tsx @@ -3,6 +3,7 @@ import type { Metadata } from 'next'; import { SoftwareApplicationSchema } from '@/components/seo/json-ld'; import ExtensionsMarketplacePageContent from './extensions-page-content'; +import RelatedPages from '@/components/seo/related-pages'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/extensions' }, @@ -41,6 +42,7 @@ export default function ExtensionsMarketplacePage() { description="Browse and install Fleetbase extensions in one click, or publish your own and earn from thousands of logistics operators." /> + ); } diff --git a/src/app/platform/fleetops/page.tsx b/src/app/platform/fleetops/page.tsx index 888fc337..cf661346 100644 --- a/src/app/platform/fleetops/page.tsx +++ b/src/app/platform/fleetops/page.tsx @@ -1,8 +1,12 @@ import type { Metadata } from 'next'; import FleetOpsPageContent from './fleetops-page-content'; +import RelatedPages from '@/components/seo/related-pages'; -const TITLE = 'Fleet-Ops — Fleet Management & Dispatch Software | Fleetbase'; +// The layout's title.template appends the brand, so the page title must not. +// Social cards are not templated, hence the separate branded string. +const TITLE = 'Fleet-Ops: Fleet Management & Dispatch'; +const SOCIAL_TITLE = 'Fleet-Ops: Fleet Management & Dispatch | Fleetbase'; const DESCRIPTION = 'Open-source fleet management and dispatch software. Real-time GPS tracking, route optimization, configurable workflows and automated dispatch.'; const CANONICAL = 'https://fleetbase.io/platform/fleetops'; @@ -23,14 +27,14 @@ export const metadata: Metadata = { ], alternates: { canonical: CANONICAL }, openGraph: { - title: TITLE, + title: SOCIAL_TITLE, description: DESCRIPTION, type: 'website', url: CANONICAL, }, twitter: { card: 'summary_large_image', - title: TITLE, + title: SOCIAL_TITLE, description: DESCRIPTION, }, }; @@ -87,6 +91,7 @@ export default function FleetOpsPage() { dangerouslySetInnerHTML={{ __html: JSON.stringify(softwareApplicationSchema) }} /> + ); } diff --git a/src/app/platform/ledger/page.tsx b/src/app/platform/ledger/page.tsx index 24ca5fe5..1cbf354c 100644 --- a/src/app/platform/ledger/page.tsx +++ b/src/app/platform/ledger/page.tsx @@ -3,6 +3,7 @@ import type { Metadata } from 'next'; import { SoftwareApplicationSchema } from '@/components/seo/json-ld'; import LedgerPageContent from './ledger-page-content'; +import RelatedPages from '@/components/seo/related-pages'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/ledger' }, @@ -31,6 +32,7 @@ export default function LedgerPage() { applicationCategory="FinanceApplication" /> + ); } diff --git a/src/app/platform/mobile/page.tsx b/src/app/platform/mobile/page.tsx index c4caac81..1a6f3073 100644 --- a/src/app/platform/mobile/page.tsx +++ b/src/app/platform/mobile/page.tsx @@ -3,6 +3,7 @@ import type { Metadata } from 'next'; import { SoftwareApplicationSchema } from '@/components/seo/json-ld'; import MobileAppsPageContent from './mobile-page-content'; +import RelatedPages from '@/components/seo/related-pages'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/mobile' }, @@ -47,6 +48,7 @@ export default function MobileAppsPage() { operatingSystem="iOS, Android" /> + ); } diff --git a/src/app/platform/navigator/page.tsx b/src/app/platform/navigator/page.tsx index 9705e8b4..5eaf2d0f 100644 --- a/src/app/platform/navigator/page.tsx +++ b/src/app/platform/navigator/page.tsx @@ -3,6 +3,7 @@ import type { Metadata } from 'next'; import { SoftwareApplicationSchema } from '@/components/seo/json-ld'; import NavigatorPageContent from './navigator-page-content'; +import RelatedPages from '@/components/seo/related-pages'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/navigator' }, @@ -44,6 +45,7 @@ export default function NavigatorPage() { operatingSystem="iOS, Android" /> + ); } diff --git a/src/app/platform/pallet/page.tsx b/src/app/platform/pallet/page.tsx index d21b487c..ff247dff 100644 --- a/src/app/platform/pallet/page.tsx +++ b/src/app/platform/pallet/page.tsx @@ -3,6 +3,7 @@ import type { Metadata } from 'next'; import { SoftwareApplicationSchema } from '@/components/seo/json-ld'; import PalletPageContent from './pallet-page-content'; +import RelatedPages from '@/components/seo/related-pages'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/pallet' }, @@ -42,6 +43,7 @@ export default function PalletPage() { description="Open-source warehouse management system for inventory tracking, pick lists, cycle counts, and fulfilment — natively connected to Fleet-Ops dispatch and Storefront orders." /> + ); } diff --git a/src/app/platform/security/page.tsx b/src/app/platform/security/page.tsx index 5582c1f2..417bacda 100644 --- a/src/app/platform/security/page.tsx +++ b/src/app/platform/security/page.tsx @@ -3,6 +3,7 @@ import type { Metadata } from 'next'; import { SoftwareApplicationSchema } from '@/components/seo/json-ld'; import SecurityCompliancePageContent from './security-page-content'; +import RelatedPages from '@/components/seo/related-pages'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/security' }, @@ -47,6 +48,7 @@ export default function SecurityCompliancePage() { applicationCategory="SecurityApplication" /> + ); } diff --git a/src/app/platform/security/security-page-content.tsx b/src/app/platform/security/security-page-content.tsx index 45b2b252..4bc008c5 100644 --- a/src/app/platform/security/security-page-content.tsx +++ b/src/app/platform/security/security-page-content.tsx @@ -303,7 +303,7 @@ export default function SecurityCompliancePageContent() {
))}
- +
diff --git a/src/app/platform/storefront/page.tsx b/src/app/platform/storefront/page.tsx index 74cbd47a..0bbbd8f4 100644 --- a/src/app/platform/storefront/page.tsx +++ b/src/app/platform/storefront/page.tsx @@ -3,6 +3,7 @@ import type { Metadata } from 'next'; import { SoftwareApplicationSchema } from '@/components/seo/json-ld'; import StorefrontPageContent from './storefront-page-content'; +import RelatedPages from '@/components/seo/related-pages'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/platform/storefront' }, @@ -43,6 +44,7 @@ export default function StorefrontPage() { description="Open-source headless commerce and multi-vendor marketplace platform with white-label mobile apps, zero commission fees, and native Fleet-Ops delivery integration." /> + ); } diff --git a/src/app/product/page.tsx b/src/app/product/page.tsx index 076abeb3..a4b75460 100644 --- a/src/app/product/page.tsx +++ b/src/app/product/page.tsx @@ -6,7 +6,7 @@ import ProductLogs from '@/components/sections/product-logs'; export const metadata: Metadata = { alternates: { canonical: 'https://fleetbase.io/product' }, - title: 'Product Overview | Fleetbase Logistics Platform', + title: 'Product Overview — The Logistics Platform', description: 'Discover what Fleetbase can do — real-time fleet tracking, order management, storefront, financial management, and a full developer API.', keywords: 'fleetbase product, logistics platform features, fleet management software, open source logistics', openGraph: { diff --git a/src/app/true-vegan/page.tsx b/src/app/true-vegan/page.tsx index 13dccb8e..73996716 100644 --- a/src/app/true-vegan/page.tsx +++ b/src/app/true-vegan/page.tsx @@ -100,7 +100,7 @@ const stackParts = [ title: 'Stripe — in-app checkout', description: 'Stripe is wired through the Fleetbase Ledger payment gateway driver. Customers pay in-app with saved cards; tips and order totals flow into the kitchen\'s Stripe dashboard.', - docs: '/docs/ledger/payments/gateways', + docs: '/docs/ledger/payments/gateways/overview', }, { icon: Navigation, diff --git a/src/components/layout/footer.tsx b/src/components/layout/footer.tsx index d7acf7db..d47a498e 100644 --- a/src/components/layout/footer.tsx +++ b/src/components/layout/footer.tsx @@ -66,6 +66,26 @@ const FOOTER_LINKS = [ ], }, { + // Role and use-case pages previously had exactly one inbound internal link + // each — they existed only in the nav dropdown and on the /solutions hub, so + // none of the homepage's authority reached the pages built for buyer intent. + title: 'By Role & Use Case', + links: [ + { label: 'Fleet Managers', href: '/solutions/roles/fleet-managers' }, + { label: 'Operations Managers', href: '/solutions/roles/operations-managers' }, + { label: 'Warehouse Managers', href: '/solutions/roles/warehouse-managers' }, + { label: 'Executives', href: '/solutions/roles/executives' }, + { label: 'Developers', href: '/solutions/roles/developers' }, + { label: 'Customer Success', href: '/solutions/roles/customer-success' }, + { label: 'Last-Mile Delivery', href: '/solutions/use-cases/last-mile-delivery' }, + { label: 'Route Optimization', href: '/solutions/use-cases/route-optimization' }, + { label: 'Fleet Management', href: '/solutions/use-cases/fleet-management' }, + { label: 'Order Management', href: '/solutions/use-cases/order-management' }, + { label: 'Analytics & Reporting', href: '/solutions/use-cases/analytics' }, + { label: 'API & Integrations', href: '/solutions/use-cases/integrations' }, + ], + }, + { title: 'Compare', links: [ { label: 'All Comparisons', href: '/compare' }, @@ -177,7 +197,7 @@ const Footer = () => { {/* Footer Navigation Links */}
-
+
{FOOTER_LINKS.map((section, index) => (

diff --git a/src/components/sections/switching-callout.tsx b/src/components/sections/switching-callout.tsx new file mode 100644 index 00000000..86648ecd --- /dev/null +++ b/src/components/sections/switching-callout.tsx @@ -0,0 +1,129 @@ +import { ArrowRight } from 'lucide-react'; +import Link from 'next/link'; + +// The homepage holds almost all of the site's authority — 620 referring pages +// against 21 for the next best — but linked to the compare pages only through +// the nav dropdown, and to the role and use-case pages not at all. These are +// body-copy links so that authority actually flows to the pages built for +// buyer intent. + +const COMPARISONS = [ + { + label: 'Fleetbase vs Onfleet', + href: '/compare/vs-onfleet', + blurb: 'No per-task pricing, and you can host it yourself.', + }, + { + label: 'Fleetbase vs Tookan', + href: '/compare/vs-tookan', + blurb: 'No agent-based pricing, and the source is yours.', + }, + { + label: 'Fleetbase vs Route4Me', + href: '/compare/vs-route4me', + blurb: 'Routing plus dispatch, WMS and storefront in one platform.', + }, +]; + +const BY_ROLE = [ + { label: 'Fleet managers', href: '/solutions/roles/fleet-managers' }, + { label: 'Operations managers', href: '/solutions/roles/operations-managers' }, + { label: 'Warehouse managers', href: '/solutions/roles/warehouse-managers' }, + { label: 'Executives', href: '/solutions/roles/executives' }, + { label: 'Developers', href: '/solutions/roles/developers' }, + { label: 'Customer success', href: '/solutions/roles/customer-success' }, +]; + +const BY_USE_CASE = [ + { label: 'Last-mile delivery', href: '/solutions/use-cases/last-mile-delivery' }, + { label: 'Route optimization', href: '/solutions/use-cases/route-optimization' }, + { label: 'Fleet management', href: '/solutions/use-cases/fleet-management' }, + { label: 'Order management', href: '/solutions/use-cases/order-management' }, + { label: 'Analytics & reporting', href: '/solutions/use-cases/analytics' }, + { label: 'API & integrations', href: '/solutions/use-cases/integrations' }, +]; + +function LinkList({ + heading, + links, +}: { + heading: string; + links: { label: string; href: string }[]; +}) { + return ( +
+

+ {heading} +

+
    + {links.map((link) => ( +
  • + + {link.label} + +
  • + ))} +
+
+ ); +} + +export default function SwitchingCallout() { + return ( +
+
+
+

+ Already paying for a delivery or fleet tool? +

+

+ See how Fleetbase compares on price, ownership and what you actually + get — then find the pages written for your team. +

+
+ +
+ {COMPARISONS.map((item) => ( + + + {item.label} + + + + {item.blurb} + + + ))} +
+ +
+ + +
+

+ Still deciding? +

+

+ Every comparison is written honestly — including where the other + tool is the better fit. +

+ + See all comparisons + + +
+
+
+
+ ); +} diff --git a/src/components/seo/related-pages.tsx b/src/components/seo/related-pages.tsx new file mode 100644 index 00000000..2661dde0 --- /dev/null +++ b/src/components/seo/related-pages.tsx @@ -0,0 +1,57 @@ +'use client'; + +import { ArrowRight } from 'lucide-react'; +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; + +import { relatedPagesFor } from '@/lib/related-pages'; + +/** + * Renders the cross-links defined for the current route. + * + * It looks itself up by pathname rather than taking props, so a page opts in by + * dropping `` into its markup and the pairings stay in one file + * instead of being threaded through thirty page components. Renders nothing for + * a route with no entry, so it is safe to place in a shared layout. + */ +export default function RelatedPages({ + heading = 'Related', + className, +}: { + heading?: string; + className?: string; +}) { + const pathname = usePathname(); + const links = relatedPagesFor(pathname); + + if (links.length === 0) { + return null; + } + + return ( +
+
+

+ {heading} +

+
+ {links.map((link) => ( + + + {link.label} + + + + {link.description} + + + ))} +
+
+
+ ); +} diff --git a/src/components/solutions/solution-page-layout.tsx b/src/components/solutions/solution-page-layout.tsx index 75b8455a..7b10b4cb 100644 --- a/src/components/solutions/solution-page-layout.tsx +++ b/src/components/solutions/solution-page-layout.tsx @@ -3,6 +3,7 @@ import Image from 'next/image'; import { ArrowRight, Check, ChevronDown, X } from 'lucide-react'; import { Breadcrumbs, type BreadcrumbItem } from '@/components/ui/breadcrumbs'; import { Button } from '@/components/ui/button'; +import RelatedPages from '@/components/seo/related-pages'; import { relForHref } from '@/lib/external-link'; import { cn } from '@/lib/utils'; @@ -325,6 +326,9 @@ export default function SolutionPageLayout({ )} + {/* Cross-links into the platform modules and sibling solutions. */} + + {/* ── Bottom CTA ────────────────────────────────────────────────── */}
diff --git a/src/lib/ghost.ts b/src/lib/ghost.ts index 1aa8c454..99b17c2f 100644 --- a/src/lib/ghost.ts +++ b/src/lib/ghost.ts @@ -1,6 +1,12 @@ import 'server-only'; -const BLOG_REVALIDATE_SECONDS = 300; +// One hour, matching the s-maxage set on /blog routes in next.config.ts. +// The blog was already on ISR — the plan's "rendered on every request" +// diagnosis was wrong — but a 5-minute window meant frequent regeneration +// and a cold render for whoever arrived first after each expiry, which is the +// likeliest source of the ~390ms TTFB. Ghost content does not change often +// enough to need a 5-minute window. +const BLOG_REVALIDATE_SECONDS = 3600; const GHOST_API_VERSION = process.env.GHOST_API_VERSION?.trim() || 'v6.0'; export type BlogAuthor = { diff --git a/src/lib/related-pages.ts b/src/lib/related-pages.ts new file mode 100644 index 00000000..4d9873c1 --- /dev/null +++ b/src/lib/related-pages.ts @@ -0,0 +1,186 @@ +// Cross-links between the pages built for buyer intent. +// +// The homepage has 620 referring pages; the next best has 21. Meanwhile the +// /solutions role and use-case pages had a single inbound internal link each, +// so none of that authority reached them. These pairings connect each platform +// module to the roles and industries that actually buy it, and back again, so +// the cluster shares the authority instead of stranding it on the homepage. +// +// Keep both directions in sync when editing: if A lists B, B should list A. + +export type RelatedLink = { + label: string; + href: string; + description: string; +}; + +export const RELATED_PAGES: Record = { + // ── Platform modules → the roles, industries and comparisons that match ── + '/platform/fleetops': [ + { label: 'For Fleet Managers', href: '/solutions/roles/fleet-managers', description: 'Vehicle health, compliance and driver performance in one place.' }, + { label: 'Trucking & Haulage', href: '/solutions/trucking', description: 'Replace a legacy TMS with open-source fleet management.' }, + { label: 'Last-Mile Delivery', href: '/solutions/use-cases/last-mile-delivery', description: 'Automate dispatch and cut failed deliveries.' }, + { label: 'Route Optimization', href: '/solutions/use-cases/route-optimization', description: 'Multi-stop routing with live traffic and time windows.' }, + { label: 'Fleetbase vs Onfleet', href: '/compare/vs-onfleet', description: 'The open-source alternative, without per-task pricing.' }, + ], + '/platform/navigator': [ + { label: 'For Fleet Managers', href: '/solutions/roles/fleet-managers', description: 'Give drivers an app you control end to end.' }, + { label: 'Courier & Parcel', href: '/solutions/courier-services', description: 'Proof of delivery and live tracking for courier work.' }, + { label: 'Last-Mile Delivery', href: '/solutions/use-cases/last-mile-delivery', description: 'Turn-by-turn navigation and digital POD.' }, + { label: 'Fleetbase vs Tookan', href: '/compare/vs-tookan', description: 'No agent-based pricing, and the source is yours.' }, + ], + '/platform/pallet': [ + { label: 'For Warehouse Managers', href: '/solutions/roles/warehouse-managers', description: 'Inventory, pick-and-pack and outbound dispatch.' }, + { label: 'E-commerce & Retail', href: '/solutions/ecommerce', description: 'Connect stock to same-day and next-day delivery.' }, + { label: 'Order Management', href: '/solutions/use-cases/order-management', description: 'Configurable workflows for any order type.' }, + { label: 'Container Operations', href: '/solutions/container-operations', description: 'Yard and multi-modal container visibility.' }, + ], + '/platform/storefront': [ + { label: 'E-commerce & Retail', href: '/solutions/ecommerce', description: 'Headless commerce wired straight into delivery.' }, + { label: 'Food & Grocery Delivery', href: '/solutions/food-delivery', description: 'On-demand ordering with live customer tracking.' }, + { label: 'Order Management', href: '/solutions/use-cases/order-management', description: 'One order pipeline from checkout to doorstep.' }, + ], + '/platform/ledger': [ + { label: 'For Executives', href: '/solutions/roles/executives', description: 'Cost efficiency and margin visibility across the fleet.' }, + { label: 'Analytics & Reporting', href: '/solutions/use-cases/analytics', description: 'Turn operational data into decisions.' }, + { label: 'Pricing', href: '/pricing', description: 'One plan, every module, no per-delivery fee.' }, + ], + '/platform/ai': [ + { label: 'For Executives', href: '/solutions/roles/executives', description: 'Ask operational questions in plain language.' }, + { label: 'Route Optimization', href: '/solutions/use-cases/route-optimization', description: 'AI routing across live constraints.' }, + { label: 'Analytics & Reporting', href: '/solutions/use-cases/analytics', description: 'Insights over your own order history.' }, + ], + '/platform/developer-console': [ + { label: 'For Developers', href: '/solutions/roles/developers', description: 'API keys, webhooks and monitoring in one console.' }, + { label: 'API & Integrations', href: '/solutions/use-cases/integrations', description: 'Connect Fleetbase to the rest of your stack.' }, + { label: 'Developer Hub', href: '/developers', description: 'REST API, SDKs and the extension framework.' }, + ], + '/platform/extensions': [ + { label: 'For Developers', href: '/solutions/roles/developers', description: 'Build and publish your own modules.' }, + { label: 'API & Integrations', href: '/solutions/use-cases/integrations', description: 'Pre-built integrations and a full REST API.' }, + { label: 'Build an Extension', href: '/developers/extensions', description: 'Scaffold a full-stack module with the CLI.' }, + ], + '/platform/security': [ + { label: 'Military & Government', href: '/solutions/government', description: 'Self-hosted, air-gap capable, sovereign by design.' }, + { label: 'Healthcare & Pharmacy', href: '/solutions/healthcare', description: 'Chain-of-custody and encrypted audit trails.' }, + { label: 'For Executives', href: '/solutions/roles/executives', description: 'Compliance posture without vendor lock-in.' }, + ], + '/platform/mobile': [ + { label: 'Navigator Driver App', href: '/platform/navigator', description: 'The open-source app your drivers carry.' }, + { label: 'Courier & Parcel', href: '/solutions/courier-services', description: 'Branded apps for courier operations.' }, + { label: 'Food & Grocery Delivery', href: '/solutions/food-delivery', description: 'Customer ordering and driver dispatch.' }, + ], + + // ── Roles → the modules and comparisons that serve them ── + '/solutions/roles/fleet-managers': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Dispatch, tracking and maintenance in one module.' }, + { label: 'Navigator Driver App', href: '/platform/navigator', description: 'Real-time dispatch and proof of delivery.' }, + { label: 'Trucking & Haulage', href: '/solutions/trucking', description: 'Built for haulage and long-distance fleets.' }, + { label: 'Fleetbase vs Onfleet', href: '/compare/vs-onfleet', description: 'How we compare on price and ownership.' }, + ], + '/solutions/roles/operations-managers': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'One dashboard for dispatch and exceptions.' }, + { label: 'Order Management', href: '/solutions/use-cases/order-management', description: 'Custom workflows, statuses and fields.' }, + { label: 'Analytics & Reporting', href: '/solutions/use-cases/analytics', description: 'SLA and performance reporting.' }, + ], + '/solutions/roles/warehouse-managers': [ + { label: 'Pallet WMS', href: '/platform/pallet', description: 'Inventory, cycle counts and fulfilment.' }, + { label: 'E-commerce & Retail', href: '/solutions/ecommerce', description: 'Stock connected to delivery promises.' }, + { label: 'Order Management', href: '/solutions/use-cases/order-management', description: 'Outbound orders end to end.' }, + ], + '/solutions/roles/executives': [ + { label: 'Analytics & Reporting', href: '/solutions/use-cases/analytics', description: 'Cost, SLA and growth metrics.' }, + { label: 'Ledger', href: '/platform/ledger', description: 'Financial management inside the platform.' }, + { label: 'Pricing', href: '/pricing', description: 'Predictable cost with no per-delivery fee.' }, + ], + '/solutions/roles/developers': [ + { label: 'Developer Hub', href: '/developers', description: 'REST API, SDKs, webhooks and extensions.' }, + { label: 'Developer Console', href: '/platform/developer-console', description: 'Keys, webhooks and request monitoring.' }, + { label: 'API & Integrations', href: '/solutions/use-cases/integrations', description: 'Fit Fleetbase to your existing stack.' }, + ], + '/solutions/roles/customer-success': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Live order status for every enquiry.' }, + { label: 'Order Management', href: '/solutions/use-cases/order-management', description: 'Track and resolve orders in one place.' }, + { label: 'Storefront', href: '/platform/storefront', description: 'Branded tracking your customers trust.' }, + ], + + // ── Use cases → modules and comparisons ── + '/solutions/use-cases/last-mile-delivery': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Automated dispatch and live tracking.' }, + { label: 'Navigator Driver App', href: '/platform/navigator', description: 'Navigation and proof of delivery.' }, + { label: 'Fleetbase vs Onfleet', href: '/compare/vs-onfleet', description: 'The open-source last-mile alternative.' }, + ], + '/solutions/use-cases/route-optimization': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Routing built into dispatch, not bolted on.' }, + { label: 'Fleetbase vs Route4Me', href: '/compare/vs-route4me', description: 'Routing plus a full platform, no per-route fee.' }, + { label: 'Logistics AI', href: '/platform/ai', description: 'AI routing across live constraints.' }, + ], + '/solutions/use-cases/fleet-management': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Tracking, maintenance and compliance.' }, + { label: 'For Fleet Managers', href: '/solutions/roles/fleet-managers', description: 'Built around the fleet manager’s day.' }, + { label: 'Trucking & Haulage', href: '/solutions/trucking', description: 'Haulage-specific workflows and compliance.' }, + ], + '/solutions/use-cases/order-management': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Configurable order types and activity flows.' }, + { label: 'Storefront', href: '/platform/storefront', description: 'Orders from checkout through delivery.' }, + { label: 'Pallet WMS', href: '/platform/pallet', description: 'Pick, pack and fulfil against stock.' }, + ], + '/solutions/use-cases/analytics': [ + { label: 'Ledger', href: '/platform/ledger', description: 'Financial reporting alongside operations.' }, + { label: 'For Executives', href: '/solutions/roles/executives', description: 'The numbers leadership asks for.' }, + { label: 'Logistics AI', href: '/platform/ai', description: 'Ask questions of your own data.' }, + ], + '/solutions/use-cases/integrations': [ + { label: 'Developer Hub', href: '/developers', description: 'REST API, SDKs and webhooks.' }, + { label: 'Extensions Marketplace', href: '/platform/extensions', description: 'Install or publish integrations.' }, + { label: 'For Developers', href: '/solutions/roles/developers', description: 'An API-first platform you can own.' }, + ], + + // ── Industries → modules ── + '/solutions/trucking': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Dispatch, tracking and maintenance.' }, + { label: 'For Fleet Managers', href: '/solutions/roles/fleet-managers', description: 'Compliance and driver performance.' }, + { label: 'Fleet Management', href: '/solutions/use-cases/fleet-management', description: 'The full fleet management picture.' }, + ], + '/solutions/food-delivery': [ + { label: 'Storefront', href: '/platform/storefront', description: 'Branded ordering for on-demand food.' }, + { label: 'Navigator Driver App', href: '/platform/navigator', description: 'Dispatch and live customer tracking.' }, + { label: 'Last-Mile Delivery', href: '/solutions/use-cases/last-mile-delivery', description: 'Speed and reliability at the door.' }, + ], + '/solutions/courier-services': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Automated dispatch at courier volume.' }, + { label: 'Navigator Driver App', href: '/platform/navigator', description: 'Scan, deliver and capture POD.' }, + { label: 'Last-Mile Delivery', href: '/solutions/use-cases/last-mile-delivery', description: 'First-attempt delivery rates.' }, + ], + '/solutions/ecommerce': [ + { label: 'Storefront', href: '/platform/storefront', description: 'Headless commerce with zero commission.' }, + { label: 'Pallet WMS', href: '/platform/pallet', description: 'Stock, picking and fulfilment.' }, + { label: 'Order Management', href: '/solutions/use-cases/order-management', description: 'Checkout to doorstep in one pipeline.' }, + ], + '/solutions/healthcare': [ + { label: 'Security & Compliance', href: '/platform/security', description: 'Encryption, RBAC and audit trails.' }, + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Priority dispatch and chain of custody.' }, + { label: 'Last-Mile Delivery', href: '/solutions/use-cases/last-mile-delivery', description: 'Time-critical delivery workflows.' }, + ], + '/solutions/waste-management': [ + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Collection rounds and vehicle maintenance.' }, + { label: 'Route Optimization', href: '/solutions/use-cases/route-optimization', description: 'Optimise collection routes and fuel.' }, + { label: 'For Fleet Managers', href: '/solutions/roles/fleet-managers', description: 'Compliance reporting for the fleet.' }, + ], + '/solutions/container-operations': [ + { label: 'Pallet WMS', href: '/platform/pallet', description: 'Yard, warehouse and container stock.' }, + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Drayage and multi-modal movements.' }, + { label: 'Analytics & Reporting', href: '/solutions/use-cases/analytics', description: 'Dwell time and throughput reporting.' }, + ], + '/solutions/government': [ + { label: 'Security & Compliance', href: '/platform/security', description: 'Air-gap capable and self-hosted.' }, + { label: 'Fleet-Ops', href: '/platform/fleetops', description: 'Fleet operations you fully control.' }, + { label: 'Open Source Mission', href: '/company/open-source', description: 'Why the source being open matters here.' }, + ], +}; + +export function relatedPagesFor(pathname: string): RelatedLink[] { + // Tolerate a trailing slash so the lookup matches however the route resolved. + const key = pathname.length > 1 ? pathname.replace(/\/+$/, '') : pathname; + return RELATED_PAGES[key] ?? []; +}