JSON-LD Improvements
This commit is contained in:
@@ -1,6 +1,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { page } from '$app/state';
|
||||||
import type { FaqList } from '$lib/types/faq';
|
import type { FaqList } from '$lib/types/faq';
|
||||||
|
|
||||||
|
const BASE = 'https://mifi.ventures';
|
||||||
|
const PAGE_URL = `${BASE}${page.url?.pathname ?? '/'}`;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
faqList,
|
faqList,
|
||||||
title = 'FAQ',
|
title = 'FAQ',
|
||||||
@@ -8,6 +12,32 @@
|
|||||||
faqList: FaqList;
|
faqList: FaqList;
|
||||||
title?: string;
|
title?: string;
|
||||||
} = $props();
|
} = $props();
|
||||||
|
|
||||||
|
const faqPageJsonLd = $derived(
|
||||||
|
JSON.stringify({
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'FAQPage',
|
||||||
|
'@id': `${PAGE_URL}#faq`,
|
||||||
|
mainEntity: faqList.map((item) => ({
|
||||||
|
'@type': 'Question',
|
||||||
|
name: item.question,
|
||||||
|
acceptedAnswer: {
|
||||||
|
'@type': 'Answer',
|
||||||
|
text: item.answer,
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
const jsonLdHtml = $derived(
|
||||||
|
faqPageJsonLd
|
||||||
|
? '<scr' +
|
||||||
|
'ipt type="application/ld+json">' +
|
||||||
|
faqPageJsonLd +
|
||||||
|
'</scr' +
|
||||||
|
'ipt>'
|
||||||
|
: '',
|
||||||
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section id="faq" class="section faq" aria-labelledby="faq-heading">
|
<section id="faq" class="section faq" aria-labelledby="faq-heading">
|
||||||
@@ -20,6 +50,10 @@
|
|||||||
{/each}
|
{/each}
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
|
{#if jsonLdHtml}
|
||||||
|
<!-- eslint-disable-next-line svelte/no-at-html-tags -- static trusted JSON-LD -->
|
||||||
|
{@html jsonLdHtml}
|
||||||
|
{/if}
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import type { PageMeta } from '$lib/seo';
|
import type { PageMeta } from '$lib/seo';
|
||||||
import { defaultJsonLdGraph } from './json-ld';
|
import { baseJsonLdGraph, catalogJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||||
|
import { homepageJsonLdGraph } from '$lib/data/json-ld/webpageJsonLdGraphs';
|
||||||
|
|
||||||
export const homeMeta: PageMeta = {
|
export const homeMeta: PageMeta = {
|
||||||
title: 'mifi Ventures — Hands-On Product Architecture for Early-Stage SaaS | Boston, MA',
|
title: 'mifi Ventures — Hands-On Product Architecture for Early-Stage SaaS | Boston, MA',
|
||||||
description:
|
description:
|
||||||
'Product architecture and senior software engineering for early-stage SaaS teams. Mike Fitzpatrick works inside your codebase to build foundations that ship fast without structural debt—frontend systems, MVP launch, fractional CTO, and stage-aligned infrastructure.',
|
'Product architecture and senior software engineering for early-stage SaaS teams. Mike Fitzpatrick works inside your codebase to build foundations that ship fast without structural debt—frontend systems, MVP launch, fractional CTO, and stage-aligned infrastructure.',
|
||||||
jsonLd: defaultJsonLdGraph,
|
canonical: 'https://mifi.ventures',
|
||||||
|
jsonLd: [...baseJsonLdGraph, homepageJsonLdGraph, ...catalogJsonLdGraph],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,20 +1,30 @@
|
|||||||
|
import { BASE, PHONE, WORDMARK } from './constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default JSON-LD graph nodes (Organization, Person, WebSite, WebPage, OfferCatalog).
|
* Default JSON-LD graph nodes (Organization, Person, WebSite, WebPage,
|
||||||
|
* ProfessionalService, OfferCatalog).
|
||||||
|
*
|
||||||
* Used for the home page; other pages can add or override via meta.jsonLd.
|
* Used for the home page; other pages can add or override via meta.jsonLd.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const BASE = 'https://mifi.ventures';
|
export const baseJsonLdGraph: Record<string, unknown>[] = [
|
||||||
|
|
||||||
export const defaultJsonLdGraph: Record<string, unknown>[] = [
|
|
||||||
{
|
{
|
||||||
'@type': 'Organization',
|
'@type': 'Organization',
|
||||||
'@id': `${BASE}/#organization`,
|
'@id': `${BASE}/#organization`,
|
||||||
name: 'mifi Ventures, LLC',
|
name: 'mifi Ventures, LLC',
|
||||||
legalName: 'mifi Ventures, LLC',
|
legalName: 'mifi Ventures, LLC',
|
||||||
url: `${BASE}/`,
|
url: `${BASE}/`,
|
||||||
logo: { '@type': 'ImageObject', url: `${BASE}/favicon.svg` },
|
logo: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
image: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
telephone: PHONE,
|
||||||
description:
|
description:
|
||||||
'Hands-on product architecture for early-stage SaaS: frontend systems, MVP launch support, fractional CTO guidance, and stage-aligned infrastructure strategy.',
|
'Hands-on product architecture for early-stage SaaS teams: SaaS product architecture, MVP architecture and launch support, fractional CTO guidance, and stage-aligned infrastructure strategy.',
|
||||||
founder: { '@id': `${BASE}/#principal` },
|
founder: { '@id': `${BASE}/#principal` },
|
||||||
address: {
|
address: {
|
||||||
'@type': 'PostalAddress',
|
'@type': 'PostalAddress',
|
||||||
@@ -22,10 +32,18 @@ export const defaultJsonLdGraph: Record<string, unknown>[] = [
|
|||||||
addressRegion: 'MA',
|
addressRegion: 'MA',
|
||||||
addressCountry: 'US',
|
addressCountry: 'US',
|
||||||
},
|
},
|
||||||
geo: { '@type': 'GeoCoordinates', latitude: 42.360082, longitude: -71.05888 },
|
|
||||||
areaServed: { '@type': 'Country', name: 'United States' },
|
areaServed: { '@type': 'Country', name: 'United States' },
|
||||||
hasOfferCatalog: { '@id': `${BASE}/#services` },
|
hasOfferCatalog: { '@id': `${BASE}/#services` },
|
||||||
sameAs: ['https://www.linkedin.com/in/the-mifi', 'https://github.com/the-mifi'],
|
sameAs: ['https://www.linkedin.com/in/the-mifi', 'https://github.com/the-mifi'],
|
||||||
|
contactPoint: [
|
||||||
|
{
|
||||||
|
'@type': 'ContactPoint',
|
||||||
|
contactType: 'sales',
|
||||||
|
telephone: PHONE,
|
||||||
|
areaServed: 'US',
|
||||||
|
availableLanguage: ['en'],
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'@type': 'Person',
|
'@type': 'Person',
|
||||||
@@ -33,24 +51,27 @@ export const defaultJsonLdGraph: Record<string, unknown>[] = [
|
|||||||
name: 'Mike Fitzpatrick',
|
name: 'Mike Fitzpatrick',
|
||||||
jobTitle: 'Product Architect and Senior Software Engineer',
|
jobTitle: 'Product Architect and Senior Software Engineer',
|
||||||
description:
|
description:
|
||||||
'Hands-on technical partner for early-stage SaaS teams; works inside codebases to build foundations that ship fast without structural debt.',
|
'Hands-on technical partner for early-stage SaaS teams; works inside codebases to build strong product foundations that ship fast without structural debt.',
|
||||||
url: `${BASE}/`,
|
url: `${BASE}/`,
|
||||||
worksFor: { '@id': `${BASE}/#organization` },
|
worksFor: { '@id': `${BASE}/#organization` },
|
||||||
knowsAbout: [
|
knowsAbout: [
|
||||||
|
'Product Architecture',
|
||||||
'Frontend Architecture',
|
'Frontend Architecture',
|
||||||
'UI Architecture',
|
'UI Architecture',
|
||||||
'React Development',
|
'React Development',
|
||||||
'Web Performance Optimization',
|
|
||||||
'Core Web Vitals',
|
|
||||||
'Technical SEO',
|
|
||||||
'Web Accessibility (WCAG)',
|
|
||||||
'Component Libraries',
|
|
||||||
'Design Systems',
|
|
||||||
'JavaScript',
|
'JavaScript',
|
||||||
'TypeScript',
|
'TypeScript',
|
||||||
'Modern Web Development',
|
'Component Libraries',
|
||||||
|
'Design Systems',
|
||||||
|
'Design Tokens',
|
||||||
|
'CSS Architecture',
|
||||||
|
'Web Accessibility (WCAG)',
|
||||||
|
'Technical SEO',
|
||||||
|
'Core Web Vitals',
|
||||||
|
'MVP Architecture',
|
||||||
'Greenfield Product Development',
|
'Greenfield Product Development',
|
||||||
'Legacy System Modernization',
|
'Fractional CTO',
|
||||||
|
'Startup Infrastructure Strategy',
|
||||||
'Code Refactoring',
|
'Code Refactoring',
|
||||||
],
|
],
|
||||||
sameAs: ['https://www.linkedin.com/in/the-mifi', 'https://github.com/the-mifi'],
|
sameAs: ['https://www.linkedin.com/in/the-mifi', 'https://github.com/the-mifi'],
|
||||||
@@ -60,8 +81,12 @@ export const defaultJsonLdGraph: Record<string, unknown>[] = [
|
|||||||
'@id': `${BASE}/#website`,
|
'@id': `${BASE}/#website`,
|
||||||
url: `${BASE}/`,
|
url: `${BASE}/`,
|
||||||
name: 'mifi Ventures',
|
name: 'mifi Ventures',
|
||||||
description: 'Hands-on product architecture for early-stage SaaS — Boston, MA',
|
description: 'Hands-on product architecture for early-stage SaaS teams.',
|
||||||
publisher: { '@id': `${BASE}/#organization` },
|
publisher: { '@id': `${BASE}/#organization` },
|
||||||
|
image: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
potentialAction: {
|
potentialAction: {
|
||||||
'@type': 'ReserveAction',
|
'@type': 'ReserveAction',
|
||||||
target: {
|
target: {
|
||||||
@@ -71,94 +96,86 @@ export const defaultJsonLdGraph: Record<string, unknown>[] = [
|
|||||||
name: 'Schedule a 30-minute intro call',
|
name: 'Schedule a 30-minute intro call',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
];
|
||||||
'@type': 'WebPage',
|
|
||||||
'@id': `${BASE}/#webpage`,
|
export const catalogJsonLdGraph: Record<string, unknown>[] = [
|
||||||
url: `${BASE}/`,
|
|
||||||
name: 'mifi Ventures — Hands-On Product Architecture for Early-Stage SaaS | Boston, MA',
|
|
||||||
description:
|
|
||||||
'Product architecture and senior software engineering for early-stage SaaS. Ship fast without structural debt—frontend systems, MVP launch, fractional CTO, stage-aligned infrastructure.',
|
|
||||||
isPartOf: { '@id': `${BASE}/#website` },
|
|
||||||
about: { '@id': `${BASE}/#organization` },
|
|
||||||
mainEntity: { '@id': `${BASE}/#organization` },
|
|
||||||
primaryImageOfPage: { '@type': 'ImageObject', url: `${BASE}/favicon.svg` },
|
|
||||||
inLanguage: 'en-US',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
'@type': 'ProfessionalService',
|
'@type': 'ProfessionalService',
|
||||||
'@id': `${BASE}/#professional-service`,
|
'@id': `${BASE}/#professional-service`,
|
||||||
name: 'mifi Ventures',
|
name: 'mifi Ventures',
|
||||||
url: `${BASE}/`,
|
url: `${BASE}/`,
|
||||||
|
image: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
logo: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
telephone: PHONE,
|
||||||
description:
|
description:
|
||||||
'Hands-on product architecture for early-stage SaaS teams: product architecture, MVP launch support, fractional CTO, and stage-aligned infrastructure.',
|
'Hands-on product architecture and senior software engineering for early-stage SaaS teams: SaaS product architecture, MVP architecture and launch, fractional CTO guidance, and stage-aligned infrastructure.',
|
||||||
serviceType: [
|
serviceType: [
|
||||||
'Product Architecture',
|
'SaaS Product Architecture',
|
||||||
'SaaS Engineering Consulting',
|
'MVP Architecture and Launch Consulting',
|
||||||
'Fractional CTO Services',
|
'Fractional CTO Services',
|
||||||
'Startup Infrastructure Strategy',
|
'Startup Infrastructure Strategy',
|
||||||
],
|
],
|
||||||
provider: { '@id': `${BASE}/#organization` },
|
provider: { '@id': `${BASE}/#organization` },
|
||||||
|
address: {
|
||||||
|
'@type': 'PostalAddress',
|
||||||
|
addressLocality: 'Boston',
|
||||||
|
addressRegion: 'MA',
|
||||||
|
addressCountry: 'US',
|
||||||
|
},
|
||||||
areaServed: { '@type': 'Country', name: 'United States' },
|
areaServed: { '@type': 'Country', name: 'United States' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'@type': 'OfferCatalog',
|
'@type': 'OfferCatalog',
|
||||||
'@id': `${BASE}/#services`,
|
'@id': `${BASE}/#services`,
|
||||||
name: 'Software Engineering Consulting Services',
|
name: 'SaaS Architecture Services',
|
||||||
description: 'Consulting services offered by mifi Ventures',
|
description:
|
||||||
numberOfItems: 6,
|
'Consulting services offered by mifi Ventures for early-stage SaaS teams.',
|
||||||
|
numberOfItems: 4,
|
||||||
itemListElement: [
|
itemListElement: [
|
||||||
{
|
{
|
||||||
'@type': 'Offer',
|
'@type': 'Offer',
|
||||||
|
url: `${BASE}/hands-on-saas-architecture-consultant`,
|
||||||
itemOffered: {
|
itemOffered: {
|
||||||
'@type': 'Service',
|
'@type': 'Service',
|
||||||
name: 'Frontend and UI Architecture',
|
name: 'Hands-On SaaS Architecture',
|
||||||
description:
|
description:
|
||||||
'Product-focused frontend and UI architecture for modern web applications, with an emphasis on clarity, scalability, and long-term maintainability.',
|
'Hands-on product architecture for early-stage SaaS teams, focused on frontend systems, reusable components, design tokens, accessibility, and scalable foundations for fast iteration.',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'@type': 'Offer',
|
'@type': 'Offer',
|
||||||
|
url: `${BASE}/mvp-architecture-and-launch`,
|
||||||
itemOffered: {
|
itemOffered: {
|
||||||
'@type': 'Service',
|
'@type': 'Service',
|
||||||
name: 'Greenfield Product Development',
|
name: 'MVP Architecture & Launch',
|
||||||
description:
|
description:
|
||||||
'Greenfield product builds and early-stage foundations, getting new projects off the ground quickly with structures designed to grow, not be rewritten.',
|
'Architecture and implementation support for early-stage SaaS MVPs that need to ship quickly without creating structural debt, fragile CSS, or difficult-to-extend product foundations.',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'@type': 'Offer',
|
'@type': 'Offer',
|
||||||
|
url: `${BASE}/fractional-cto-for-early-stage-saas`,
|
||||||
itemOffered: {
|
itemOffered: {
|
||||||
'@type': 'Service',
|
'@type': 'Service',
|
||||||
name: 'Performance Optimization',
|
name: 'Fractional CTO / Technical Partner',
|
||||||
description:
|
description:
|
||||||
'Performance, Core Web Vitals, rendering strategy, and technical SEO optimization focused on real-world user journeys.',
|
'Part-time technical leadership for early-stage SaaS teams that need architectural guidance, tradeoff evaluation, and hands-on technical oversight without hiring a full-time CTO.',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'@type': 'Offer',
|
'@type': 'Offer',
|
||||||
|
url: `${BASE}/stage-aligned-infrastructure`,
|
||||||
itemOffered: {
|
itemOffered: {
|
||||||
'@type': 'Service',
|
'@type': 'Service',
|
||||||
name: 'Accessibility Engineering',
|
name: 'Stage-Aligned Infrastructure',
|
||||||
description:
|
description:
|
||||||
'Accessibility-first engineering, ensuring WCAG-compliant interfaces with semantic markup, keyboard parity, and inclusive interaction patterns.',
|
'Infrastructure strategy for early-stage SaaS teams that aligns cloud, SaaS, and deployment decisions with company stage, reducing unnecessary complexity and preserving runway.',
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'@type': 'Offer',
|
|
||||||
itemOffered: {
|
|
||||||
'@type': 'Service',
|
|
||||||
name: 'System Modernization',
|
|
||||||
description:
|
|
||||||
'Modernization and stabilization of existing systems, including refactors, framework upgrades, and untangling overgrown frontend codebases.',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'@type': 'Offer',
|
|
||||||
itemOffered: {
|
|
||||||
'@type': 'Service',
|
|
||||||
name: 'End-to-End Feature Delivery',
|
|
||||||
description:
|
|
||||||
'End-to-end feature delivery with clear ownership and documentation, spanning frontend and supporting backend work without unnecessary complexity.',
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
3
src/lib/data/json-ld/constants.ts
Normal file
3
src/lib/data/json-ld/constants.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export const BASE = 'https://mifi.ventures';
|
||||||
|
export const WORDMARK = `${BASE}/assets/wordmark.svg`;
|
||||||
|
export const PHONE = '+1-888-991-6434';
|
||||||
68
src/lib/data/json-ld/servicesJsonLdGraphs.ts
Normal file
68
src/lib/data/json-ld/servicesJsonLdGraphs.ts
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
import { BASE } from './constants';
|
||||||
|
|
||||||
|
export const handsOnSaaSArchitectureConsultantServiceJsonLdGraph: Record<
|
||||||
|
string,
|
||||||
|
unknown
|
||||||
|
> = {
|
||||||
|
'@type': 'Service',
|
||||||
|
'@id': `${BASE}/hands-on-saas-architecture-consultant#service`,
|
||||||
|
name: 'Hands-On SaaS Architecture',
|
||||||
|
url: `${BASE}/hands-on-saas-architecture-consultant`,
|
||||||
|
description:
|
||||||
|
'Hands-on product architecture for early-stage SaaS teams, focused on frontend systems, reusable components, design tokens, accessibility, and scalable foundations for fast iteration.',
|
||||||
|
serviceType: 'SaaS Product Architecture',
|
||||||
|
provider: { '@id': `${BASE}/#organization` },
|
||||||
|
areaServed: { '@type': 'Country', name: 'United States' },
|
||||||
|
audience: {
|
||||||
|
'@type': 'Audience',
|
||||||
|
audienceType: 'Early-stage SaaS founders and engineering teams',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const mvpArchitectureAndLaunchServiceJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'Service',
|
||||||
|
'@id': `${BASE}/mvp-architecture-and-launch#service`,
|
||||||
|
name: 'MVP Architecture & Launch',
|
||||||
|
url: `${BASE}/mvp-architecture-and-launch`,
|
||||||
|
description:
|
||||||
|
'Architecture and implementation support for early-stage SaaS MVPs that need to ship quickly without structural debt, fragile CSS, or difficult-to-extend product foundations.',
|
||||||
|
serviceType: 'MVP Architecture and Launch Consulting',
|
||||||
|
provider: { '@id': `${BASE}/#organization` },
|
||||||
|
areaServed: { '@type': 'Country', name: 'United States' },
|
||||||
|
audience: {
|
||||||
|
'@type': 'Audience',
|
||||||
|
audienceType: 'Founder-led SaaS startups and early product teams',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const fractionalCtoForEarlyStageSaaSServiceJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'Service',
|
||||||
|
'@id': `${BASE}/fractional-cto-for-early-stage-saas#service`,
|
||||||
|
name: 'Fractional CTO / Technical Partner',
|
||||||
|
url: `${BASE}/fractional-cto-for-early-stage-saas`,
|
||||||
|
description:
|
||||||
|
'Part-time technical leadership for early-stage SaaS teams that need architectural guidance, tradeoff evaluation, and hands-on technical oversight without hiring a full-time CTO.',
|
||||||
|
serviceType: 'Fractional CTO Services',
|
||||||
|
provider: { '@id': `${BASE}/#organization` },
|
||||||
|
areaServed: { '@type': 'Country', name: 'United States' },
|
||||||
|
audience: {
|
||||||
|
'@type': 'Audience',
|
||||||
|
audienceType: 'Early-stage SaaS founders and growing engineering teams',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const stageAlignedInfrastructureServiceJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'Service',
|
||||||
|
'@id': `${BASE}/stage-aligned-infrastructure#service`,
|
||||||
|
name: 'Stage-Aligned Infrastructure',
|
||||||
|
url: `${BASE}/stage-aligned-infrastructure`,
|
||||||
|
description:
|
||||||
|
'Infrastructure strategy for early-stage SaaS teams that aligns cloud, SaaS, and deployment decisions with company stage, reducing unnecessary complexity and preserving runway.',
|
||||||
|
serviceType: 'Startup Infrastructure Strategy',
|
||||||
|
provider: { '@id': `${BASE}/#organization` },
|
||||||
|
areaServed: { '@type': 'Country', name: 'United States' },
|
||||||
|
audience: {
|
||||||
|
'@type': 'Audience',
|
||||||
|
audienceType: 'Early-stage SaaS founders and small engineering teams',
|
||||||
|
},
|
||||||
|
};
|
||||||
130
src/lib/data/json-ld/webpageJsonLdGraphs.ts
Normal file
130
src/lib/data/json-ld/webpageJsonLdGraphs.ts
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
import { BASE, WORDMARK } from './constants';
|
||||||
|
|
||||||
|
export const homepageJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'WebPage',
|
||||||
|
'@id': `${BASE}/#webpage`,
|
||||||
|
url: `${BASE}/`,
|
||||||
|
name: 'mifi Ventures | Hands-On Product Architecture for Early-Stage SaaS',
|
||||||
|
description:
|
||||||
|
'Hands-on product architecture for early-stage SaaS teams—SaaS architecture, MVP launch support, fractional CTO guidance, and stage-aligned infrastructure strategy.',
|
||||||
|
isPartOf: { '@id': `${BASE}/#website` },
|
||||||
|
about: { '@id': `${BASE}/#organization` },
|
||||||
|
mainEntity: { '@id': `${BASE}/#organization` },
|
||||||
|
primaryImageOfPage: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
inLanguage: 'en-US',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const servicesPageJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'WebPage',
|
||||||
|
'@id': `${BASE}/services#webpage`,
|
||||||
|
url: `${BASE}/services`,
|
||||||
|
name: 'SaaS Architecture Services | mifi Ventures',
|
||||||
|
description:
|
||||||
|
'Hands-on SaaS architecture consulting for early-stage teams. Services include product architecture, MVP launch support, fractional CTO guidance, and stage-aligned infrastructure strategy.',
|
||||||
|
isPartOf: { '@id': `${BASE}/#website` },
|
||||||
|
about: { '@id': `${BASE}/#organization` },
|
||||||
|
primaryImageOfPage: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
inLanguage: 'en-US',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const handsOnSaaSArchitectureConsultantPageJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'WebPage',
|
||||||
|
'@id': `${BASE}/hands-on-saas-architecture-consultant#webpage`,
|
||||||
|
url: `${BASE}/hands-on-saas-architecture-consultant`,
|
||||||
|
name: 'SaaS Product Architecture Consultant | mifi Ventures',
|
||||||
|
description:
|
||||||
|
'Hands-on product architecture for early-stage SaaS teams. Build frontend foundations that scale with reusable components, design tokens, accessibility, and clean architecture.',
|
||||||
|
isPartOf: { '@id': `${BASE}/#website` },
|
||||||
|
about: { '@id': `${BASE}/#organization` },
|
||||||
|
primaryImageOfPage: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
inLanguage: 'en-US',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const mvpArchitectureAndLaunchPageJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'WebPage',
|
||||||
|
'@id': `${BASE}/mvp-architecture-and-launch#webpage`,
|
||||||
|
url: `${BASE}/mvp-architecture-and-launch`,
|
||||||
|
name: 'MVP Architecture & Launch Consultant | mifi Ventures',
|
||||||
|
description:
|
||||||
|
'Architecture and implementation support for early-stage SaaS MVPs that need to ship quickly without structural debt, fragile CSS, or difficult-to-extend product foundations.',
|
||||||
|
isPartOf: { '@id': `${BASE}/#website` },
|
||||||
|
about: { '@id': `${BASE}/#organization` },
|
||||||
|
primaryImageOfPage: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
inLanguage: 'en-US',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const fractionalCtoForEarlyStageSaaSPageJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'WebPage',
|
||||||
|
'@id': `${BASE}/fractional-cto-for-early-stage-saas#webpage`,
|
||||||
|
url: `${BASE}/fractional-cto-for-early-stage-saas`,
|
||||||
|
name: 'Fractional CTO for Early-Stage SaaS | mifi Ventures',
|
||||||
|
description:
|
||||||
|
'Hands-on technical leadership for early-stage SaaS teams that need architectural guidance, technical tradeoff evaluation, and senior oversight without hiring a full-time CTO.',
|
||||||
|
isPartOf: { '@id': `${BASE}/#website` },
|
||||||
|
about: { '@id': `${BASE}/#organization` },
|
||||||
|
primaryImageOfPage: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
inLanguage: 'en-US',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const stageAlignedInfrastructurePageJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'WebPage',
|
||||||
|
'@id': `${BASE}/stage-aligned-infrastructure#webpage`,
|
||||||
|
url: `${BASE}/stage-aligned-infrastructure`,
|
||||||
|
name: 'Stage-Aligned Infrastructure for Startups | mifi Ventures',
|
||||||
|
description:
|
||||||
|
'Infrastructure strategy for early-stage SaaS teams that aligns cloud, SaaS, and deployment decisions with company stage, reducing unnecessary complexity and preserving runway.',
|
||||||
|
isPartOf: { '@id': `${BASE}/#website` },
|
||||||
|
about: { '@id': `${BASE}/#organization` },
|
||||||
|
primaryImageOfPage: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
inLanguage: 'en-US',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const privacyPolicyPageJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'WebPage',
|
||||||
|
'@id': `${BASE}/privacy-policy#webpage`,
|
||||||
|
url: `${BASE}/privacy-policy`,
|
||||||
|
name: 'Privacy Policy | mifi Ventures',
|
||||||
|
description:
|
||||||
|
'Read the mifi Ventures privacy policy, including how personal information is collected, used, stored, and protected.',
|
||||||
|
isPartOf: { '@id': `${BASE}/#website` },
|
||||||
|
about: { '@id': `${BASE}/#organization` },
|
||||||
|
primaryImageOfPage: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
inLanguage: 'en-US',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const termsOfServicePageJsonLdGraph: Record<string, unknown> = {
|
||||||
|
'@type': 'WebPage',
|
||||||
|
'@id': `${BASE}/terms-of-service#webpage`,
|
||||||
|
url: `${BASE}/terms-of-service`,
|
||||||
|
name: 'Terms of Service | mifi Ventures',
|
||||||
|
description:
|
||||||
|
'Read the mifi Ventures terms of service, including the terms governing use of the site and consulting services.',
|
||||||
|
isPartOf: { '@id': `${BASE}/#website` },
|
||||||
|
about: { '@id': `${BASE}/#organization` },
|
||||||
|
primaryImageOfPage: {
|
||||||
|
'@type': 'ImageObject',
|
||||||
|
url: WORDMARK,
|
||||||
|
},
|
||||||
|
inLanguage: 'en-US',
|
||||||
|
};
|
||||||
@@ -20,9 +20,10 @@
|
|||||||
})
|
})
|
||||||
: '',
|
: '',
|
||||||
);
|
);
|
||||||
|
|
||||||
const jsonLdHtml = $derived(
|
const jsonLdHtml = $derived(
|
||||||
jsonLdScript
|
jsonLdScript
|
||||||
? '<script type="application/ld+json">' + jsonLdScript + '</scr' + 'ipt>'
|
? '<scr' + 'ipt type="application/ld+json">' + jsonLdScript + '</scr' + 'ipt>'
|
||||||
: '',
|
: '',
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types';
|
||||||
import type { PageMeta } from '$lib/seo';
|
import type { PageMeta } from '$lib/seo';
|
||||||
|
import { baseJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||||
|
import { privacyPolicyPageJsonLdGraph } from '$lib/data/json-ld/webpageJsonLdGraphs';
|
||||||
|
|
||||||
const BASE = 'https://mifi.ventures';
|
const BASE = 'https://mifi.ventures';
|
||||||
const PATH = '/privacy-policy';
|
const PATH = '/privacy-policy';
|
||||||
@@ -10,17 +12,7 @@ const privacyPageMeta: PageMeta = {
|
|||||||
description:
|
description:
|
||||||
'Privacy Policy for mifi Ventures LLC. Describes information we collect, how we use it, messaging policy (SMS), data security, and your rights. Last updated March 5, 2026.',
|
'Privacy Policy for mifi Ventures LLC. Describes information we collect, how we use it, messaging policy (SMS), data security, and your rights. Last updated March 5, 2026.',
|
||||||
canonical: PAGE_URL,
|
canonical: PAGE_URL,
|
||||||
jsonLd: [
|
jsonLd: [...baseJsonLdGraph, privacyPolicyPageJsonLdGraph],
|
||||||
{
|
|
||||||
'@type': 'WebPage',
|
|
||||||
'@id': `${PAGE_URL}#webpage`,
|
|
||||||
name: 'Privacy Policy | mifi Ventures',
|
|
||||||
url: PAGE_URL,
|
|
||||||
dateModified: '2026-03-05',
|
|
||||||
publisher: { '@id': `${BASE}/#organization` },
|
|
||||||
inLanguage: 'en-US',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const load: PageLoad = () => {
|
export const load: PageLoad = () => {
|
||||||
|
|||||||
@@ -1,34 +1,21 @@
|
|||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types';
|
||||||
import type { PageMeta } from '$lib/seo';
|
import type { PageMeta } from '$lib/seo';
|
||||||
import { defaultJsonLdGraph } from '$lib/data/home/json-ld';
|
import { baseJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||||
import { pageContent } from '$lib/data/services/landing/content';
|
import { pageContent } from '$lib/data/services/landing/content';
|
||||||
|
import { servicesPageJsonLdGraph } from '$lib/data/json-ld/webpageJsonLdGraphs';
|
||||||
|
import { catalogJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||||
|
|
||||||
const BASE = 'https://mifi.ventures';
|
const BASE = 'https://mifi.ventures';
|
||||||
const PAGE_URL = `${BASE}/services/`;
|
const PATH = '/services';
|
||||||
|
const PAGE_URL = `${BASE}${PATH}`;
|
||||||
|
|
||||||
export const load: PageLoad = () => {
|
export const load: PageLoad = () => {
|
||||||
const { meta } = pageContent;
|
const { meta } = pageContent;
|
||||||
const servicePageMeta: PageMeta = {
|
const servicePageMeta: PageMeta = {
|
||||||
title: meta.title,
|
title: meta.title,
|
||||||
description: meta.description,
|
description: meta.description,
|
||||||
jsonLd: [
|
canonical: PAGE_URL,
|
||||||
...defaultJsonLdGraph,
|
jsonLd: [...baseJsonLdGraph, ...catalogJsonLdGraph, servicesPageJsonLdGraph],
|
||||||
{
|
|
||||||
'@type': 'ProfessionalService',
|
|
||||||
'@id': `${BASE}/services/#service`,
|
|
||||||
name: 'mifi Ventures',
|
|
||||||
url: PAGE_URL,
|
|
||||||
description: meta.jsonLdServiceDescription ?? meta.description,
|
|
||||||
serviceType: [
|
|
||||||
'SaaS Architecture Consulting',
|
|
||||||
'MVP Development Consulting',
|
|
||||||
'Fractional CTO Services',
|
|
||||||
'Startup Infrastructure Strategy',
|
|
||||||
],
|
|
||||||
provider: { '@id': `${BASE}/#organization` },
|
|
||||||
areaServed: { '@type': 'Country', name: 'United States' },
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
};
|
||||||
return { meta: servicePageMeta };
|
return { meta: servicePageMeta };
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,49 +1,24 @@
|
|||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types';
|
||||||
import type { PageMeta } from '$lib/seo';
|
import type { PageMeta } from '$lib/seo';
|
||||||
import { defaultJsonLdGraph } from '$lib/data/home/json-ld';
|
import { baseJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||||
import { pageContent } from '$lib/data/services/fractional-cto-for-early-stage-saas/content';
|
import { pageContent } from '$lib/data/services/fractional-cto-for-early-stage-saas/content';
|
||||||
import { faqItems } from '$lib/data/services/fractional-cto-for-early-stage-saas/faq';
|
import { fractionalCtoForEarlyStageSaaSServiceJsonLdGraph } from '$lib/data/json-ld/servicesJsonLdGraphs';
|
||||||
|
import { fractionalCtoForEarlyStageSaaSPageJsonLdGraph } from '$lib/data/json-ld/webpageJsonLdGraphs';
|
||||||
|
|
||||||
const BASE = 'https://mifi.ventures';
|
const BASE = 'https://mifi.ventures';
|
||||||
const PAGE_URL = `${BASE}/services/fractional-cto-for-early-stage-saas/`;
|
const PATH = '/services/fractional-cto-for-early-stage-saas';
|
||||||
|
const PAGE_URL = `${BASE}${PATH}`;
|
||||||
function buildFaqPageJsonLd(): Record<string, unknown> {
|
|
||||||
return {
|
|
||||||
'@type': 'FAQPage',
|
|
||||||
'@id': `${PAGE_URL}#faq`,
|
|
||||||
mainEntity: faqItems.map((item) => ({
|
|
||||||
'@type': 'Question',
|
|
||||||
name: item.question,
|
|
||||||
acceptedAnswer: {
|
|
||||||
'@type': 'Answer',
|
|
||||||
text: item.answer,
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export const load: PageLoad = () => {
|
export const load: PageLoad = () => {
|
||||||
const { meta } = pageContent;
|
const { meta } = pageContent;
|
||||||
const servicePageMeta: PageMeta = {
|
const servicePageMeta: PageMeta = {
|
||||||
title: meta.title,
|
title: meta.title,
|
||||||
description: meta.description,
|
description: meta.description,
|
||||||
|
canonical: PAGE_URL,
|
||||||
jsonLd: [
|
jsonLd: [
|
||||||
...defaultJsonLdGraph,
|
...baseJsonLdGraph,
|
||||||
{
|
fractionalCtoForEarlyStageSaaSPageJsonLdGraph,
|
||||||
'@type': 'ProfessionalService',
|
fractionalCtoForEarlyStageSaaSServiceJsonLdGraph,
|
||||||
'@id': `${BASE}/services/fractional-cto-for-early-stage-saas/#service`,
|
|
||||||
name: 'mifi Ventures',
|
|
||||||
url: PAGE_URL,
|
|
||||||
description: meta.jsonLdServiceDescription ?? meta.description,
|
|
||||||
serviceType: [
|
|
||||||
'Fractional CTO',
|
|
||||||
'Technical Leadership',
|
|
||||||
'SaaS Engineering Consulting',
|
|
||||||
],
|
|
||||||
provider: { '@id': `${BASE}/#organization` },
|
|
||||||
areaServed: { '@type': 'Country', name: 'United States' },
|
|
||||||
},
|
|
||||||
buildFaqPageJsonLd(),
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
return { meta: servicePageMeta };
|
return { meta: servicePageMeta };
|
||||||
|
|||||||
@@ -1,49 +1,24 @@
|
|||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types';
|
||||||
import type { PageMeta } from '$lib/seo';
|
import type { PageMeta } from '$lib/seo';
|
||||||
import { defaultJsonLdGraph } from '$lib/data/home/json-ld';
|
|
||||||
import { pageContent } from '$lib/data/services/hands-on-saas-architecture-consultant/content';
|
import { pageContent } from '$lib/data/services/hands-on-saas-architecture-consultant/content';
|
||||||
import { faqItems } from '$lib/data/services/hands-on-saas-architecture-consultant/faq';
|
import { handsOnSaaSArchitectureConsultantPageJsonLdGraph } from '$lib/data/json-ld/webpageJsonLdGraphs';
|
||||||
|
import { handsOnSaaSArchitectureConsultantServiceJsonLdGraph } from '$lib/data/json-ld/servicesJsonLdGraphs';
|
||||||
|
import { baseJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||||
|
|
||||||
const BASE = 'https://mifi.ventures';
|
const BASE = 'https://mifi.ventures';
|
||||||
const PAGE_URL = `${BASE}/services/hands-on-saas-architecture-consultant/`;
|
const PATH = '/services/hands-on-saas-architecture-consultant';
|
||||||
|
const PAGE_URL = `${BASE}${PATH}`;
|
||||||
function buildFaqPageJsonLd(): Record<string, unknown> {
|
|
||||||
return {
|
|
||||||
'@type': 'FAQPage',
|
|
||||||
'@id': `${PAGE_URL}#faq`,
|
|
||||||
mainEntity: faqItems.map((item) => ({
|
|
||||||
'@type': 'Question',
|
|
||||||
name: item.question,
|
|
||||||
acceptedAnswer: {
|
|
||||||
'@type': 'Answer',
|
|
||||||
text: item.answer,
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export const load: PageLoad = () => {
|
export const load: PageLoad = () => {
|
||||||
const { meta } = pageContent;
|
const { meta } = pageContent;
|
||||||
const servicePageMeta: PageMeta = {
|
const servicePageMeta: PageMeta = {
|
||||||
title: meta.title,
|
title: meta.title,
|
||||||
description: meta.description,
|
description: meta.description,
|
||||||
|
canonical: PAGE_URL,
|
||||||
jsonLd: [
|
jsonLd: [
|
||||||
...defaultJsonLdGraph,
|
...baseJsonLdGraph,
|
||||||
{
|
handsOnSaaSArchitectureConsultantPageJsonLdGraph,
|
||||||
'@type': 'ProfessionalService',
|
handsOnSaaSArchitectureConsultantServiceJsonLdGraph,
|
||||||
'@id': `${BASE}/services/hands-on-saas-architecture-consultant/#service`,
|
|
||||||
name: 'mifi Ventures',
|
|
||||||
url: PAGE_URL,
|
|
||||||
description: meta.jsonLdServiceDescription ?? meta.description,
|
|
||||||
serviceType: [
|
|
||||||
'Product Architecture',
|
|
||||||
'SaaS Engineering Consulting',
|
|
||||||
'Frontend Systems Architecture',
|
|
||||||
],
|
|
||||||
provider: { '@id': `${BASE}/#organization` },
|
|
||||||
areaServed: { '@type': 'Country', name: 'United States' },
|
|
||||||
},
|
|
||||||
buildFaqPageJsonLd(),
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
return { meta: servicePageMeta };
|
return { meta: servicePageMeta };
|
||||||
|
|||||||
@@ -1,49 +1,24 @@
|
|||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types';
|
||||||
import type { PageMeta } from '$lib/seo';
|
import type { PageMeta } from '$lib/seo';
|
||||||
import { defaultJsonLdGraph } from '$lib/data/home/json-ld';
|
import { baseJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||||
import { pageContent } from '$lib/data/services/mvp-architecture-and-launch/content';
|
import { pageContent } from '$lib/data/services/mvp-architecture-and-launch/content';
|
||||||
import { faqItems } from '$lib/data/services/mvp-architecture-and-launch/faq';
|
import { mvpArchitectureAndLaunchServiceJsonLdGraph } from '$lib/data/json-ld/servicesJsonLdGraphs';
|
||||||
|
import { mvpArchitectureAndLaunchPageJsonLdGraph } from '$lib/data/json-ld/webpageJsonLdGraphs';
|
||||||
|
|
||||||
const BASE = 'https://mifi.ventures';
|
const BASE = 'https://mifi.ventures';
|
||||||
const PAGE_URL = `${BASE}/services/mvp-architecture-and-launch/`;
|
const PATH = '/services/mvp-architecture-and-launch';
|
||||||
|
const PAGE_URL = `${BASE}${PATH}`;
|
||||||
function buildFaqPageJsonLd(): Record<string, unknown> {
|
|
||||||
return {
|
|
||||||
'@type': 'FAQPage',
|
|
||||||
'@id': `${PAGE_URL}#faq`,
|
|
||||||
mainEntity: faqItems.map((item) => ({
|
|
||||||
'@type': 'Question',
|
|
||||||
name: item.question,
|
|
||||||
acceptedAnswer: {
|
|
||||||
'@type': 'Answer',
|
|
||||||
text: item.answer,
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export const load: PageLoad = () => {
|
export const load: PageLoad = () => {
|
||||||
const { meta } = pageContent;
|
const { meta } = pageContent;
|
||||||
const servicePageMeta: PageMeta = {
|
const servicePageMeta: PageMeta = {
|
||||||
title: meta.title,
|
title: meta.title,
|
||||||
description: meta.description,
|
description: meta.description,
|
||||||
|
canonical: PAGE_URL,
|
||||||
jsonLd: [
|
jsonLd: [
|
||||||
...defaultJsonLdGraph,
|
...baseJsonLdGraph,
|
||||||
{
|
mvpArchitectureAndLaunchPageJsonLdGraph,
|
||||||
'@type': 'ProfessionalService',
|
mvpArchitectureAndLaunchServiceJsonLdGraph,
|
||||||
'@id': `${BASE}/services/mvp-architecture-and-launch/#service`,
|
|
||||||
name: 'mifi Ventures',
|
|
||||||
url: PAGE_URL,
|
|
||||||
description: meta.jsonLdServiceDescription ?? meta.description,
|
|
||||||
serviceType: [
|
|
||||||
'MVP Architecture',
|
|
||||||
'SaaS Engineering Consulting',
|
|
||||||
'Product Architecture',
|
|
||||||
],
|
|
||||||
provider: { '@id': `${BASE}/#organization` },
|
|
||||||
areaServed: { '@type': 'Country', name: 'United States' },
|
|
||||||
},
|
|
||||||
buildFaqPageJsonLd(),
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
return { meta: servicePageMeta };
|
return { meta: servicePageMeta };
|
||||||
|
|||||||
@@ -1,49 +1,24 @@
|
|||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types';
|
||||||
import type { PageMeta } from '$lib/seo';
|
import type { PageMeta } from '$lib/seo';
|
||||||
import { defaultJsonLdGraph } from '$lib/data/home/json-ld';
|
import { baseJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||||
import { pageContent } from '$lib/data/services/stage-aligned-infrastructure/content';
|
import { pageContent } from '$lib/data/services/stage-aligned-infrastructure/content';
|
||||||
import { faqItems } from '$lib/data/services/stage-aligned-infrastructure/faq';
|
import { stageAlignedInfrastructureServiceJsonLdGraph } from '$lib/data/json-ld/servicesJsonLdGraphs';
|
||||||
|
import { stageAlignedInfrastructurePageJsonLdGraph } from '$lib/data/json-ld/webpageJsonLdGraphs';
|
||||||
|
|
||||||
const BASE = 'https://mifi.ventures';
|
const BASE = 'https://mifi.ventures';
|
||||||
const PAGE_URL = `${BASE}/services/stage-aligned-infrastructure/`;
|
const PATH = '/services/stage-aligned-infrastructure';
|
||||||
|
const PAGE_URL = `${BASE}${PATH}`;
|
||||||
function buildFaqPageJsonLd(): Record<string, unknown> {
|
|
||||||
return {
|
|
||||||
'@type': 'FAQPage',
|
|
||||||
'@id': `${PAGE_URL}#faq`,
|
|
||||||
mainEntity: faqItems.map((item) => ({
|
|
||||||
'@type': 'Question',
|
|
||||||
name: item.question,
|
|
||||||
acceptedAnswer: {
|
|
||||||
'@type': 'Answer',
|
|
||||||
text: item.answer,
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export const load: PageLoad = () => {
|
export const load: PageLoad = () => {
|
||||||
const { meta } = pageContent;
|
const { meta } = pageContent;
|
||||||
const servicePageMeta: PageMeta = {
|
const servicePageMeta: PageMeta = {
|
||||||
title: meta.title,
|
title: meta.title,
|
||||||
description: meta.description,
|
description: meta.description,
|
||||||
|
canonical: PAGE_URL,
|
||||||
jsonLd: [
|
jsonLd: [
|
||||||
...defaultJsonLdGraph,
|
...baseJsonLdGraph,
|
||||||
{
|
stageAlignedInfrastructurePageJsonLdGraph,
|
||||||
'@type': 'ProfessionalService',
|
stageAlignedInfrastructureServiceJsonLdGraph,
|
||||||
'@id': `${BASE}/services/stage-aligned-infrastructure/#service`,
|
|
||||||
name: 'mifi Ventures',
|
|
||||||
url: PAGE_URL,
|
|
||||||
description: meta.jsonLdServiceDescription ?? meta.description,
|
|
||||||
serviceType: [
|
|
||||||
'SaaS Architecture Consulting',
|
|
||||||
'Startup Infrastructure Strategy',
|
|
||||||
'Technical Leadership Consulting',
|
|
||||||
],
|
|
||||||
provider: { '@id': `${BASE}/#organization` },
|
|
||||||
areaServed: { '@type': 'Country', name: 'United States' },
|
|
||||||
},
|
|
||||||
buildFaqPageJsonLd(),
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
return { meta: servicePageMeta };
|
return { meta: servicePageMeta };
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types';
|
||||||
import type { PageMeta } from '$lib/seo';
|
import type { PageMeta } from '$lib/seo';
|
||||||
|
import { termsOfServicePageJsonLdGraph } from '$lib/data/json-ld/webpageJsonLdGraphs';
|
||||||
|
import { baseJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||||
|
|
||||||
const BASE = 'https://mifi.ventures';
|
const BASE = 'https://mifi.ventures';
|
||||||
const PATH = '/terms-of-service';
|
const PATH = '/terms-of-service';
|
||||||
@@ -10,17 +12,7 @@ const termsPageMeta: PageMeta = {
|
|||||||
description:
|
description:
|
||||||
'Terms of Service for mifi Ventures LLC. Covers use of the website, services, client communications including SMS, acceptable use, and contact information.',
|
'Terms of Service for mifi Ventures LLC. Covers use of the website, services, client communications including SMS, acceptable use, and contact information.',
|
||||||
canonical: PAGE_URL,
|
canonical: PAGE_URL,
|
||||||
jsonLd: [
|
jsonLd: [...baseJsonLdGraph, termsOfServicePageJsonLdGraph],
|
||||||
{
|
|
||||||
'@type': 'WebPage',
|
|
||||||
'@id': `${PAGE_URL}#webpage`,
|
|
||||||
name: 'Terms of Service | mifi Ventures',
|
|
||||||
url: PAGE_URL,
|
|
||||||
dateModified: '2026-03-05',
|
|
||||||
publisher: { '@id': `${BASE}/#organization` },
|
|
||||||
inLanguage: 'en-US',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const load: PageLoad = () => {
|
export const load: PageLoad = () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user