JSON-LD Improvements
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
<script lang="ts">
|
||||
import { page } from '$app/state';
|
||||
import type { FaqList } from '$lib/types/faq';
|
||||
|
||||
const BASE = 'https://mifi.ventures';
|
||||
const PAGE_URL = `${BASE}${page.url?.pathname ?? '/'}`;
|
||||
|
||||
const {
|
||||
faqList,
|
||||
title = 'FAQ',
|
||||
@@ -8,6 +12,32 @@
|
||||
faqList: FaqList;
|
||||
title?: string;
|
||||
} = $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>
|
||||
|
||||
<section id="faq" class="section faq" aria-labelledby="faq-heading">
|
||||
@@ -20,6 +50,10 @@
|
||||
{/each}
|
||||
</dl>
|
||||
</div>
|
||||
{#if jsonLdHtml}
|
||||
<!-- eslint-disable-next-line svelte/no-at-html-tags -- static trusted JSON-LD -->
|
||||
{@html jsonLdHtml}
|
||||
{/if}
|
||||
</section>
|
||||
|
||||
<style>
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
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 = {
|
||||
title: 'mifi Ventures — Hands-On Product Architecture for Early-Stage SaaS | Boston, MA',
|
||||
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.',
|
||||
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.
|
||||
*/
|
||||
|
||||
const BASE = 'https://mifi.ventures';
|
||||
|
||||
export const defaultJsonLdGraph: Record<string, unknown>[] = [
|
||||
export const baseJsonLdGraph: Record<string, unknown>[] = [
|
||||
{
|
||||
'@type': 'Organization',
|
||||
'@id': `${BASE}/#organization`,
|
||||
name: 'mifi Ventures, LLC',
|
||||
legalName: 'mifi Ventures, LLC',
|
||||
url: `${BASE}/`,
|
||||
logo: { '@type': 'ImageObject', url: `${BASE}/favicon.svg` },
|
||||
logo: {
|
||||
'@type': 'ImageObject',
|
||||
url: WORDMARK,
|
||||
},
|
||||
image: {
|
||||
'@type': 'ImageObject',
|
||||
url: WORDMARK,
|
||||
},
|
||||
telephone: PHONE,
|
||||
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` },
|
||||
address: {
|
||||
'@type': 'PostalAddress',
|
||||
@@ -22,10 +32,18 @@ export const defaultJsonLdGraph: Record<string, unknown>[] = [
|
||||
addressRegion: 'MA',
|
||||
addressCountry: 'US',
|
||||
},
|
||||
geo: { '@type': 'GeoCoordinates', latitude: 42.360082, longitude: -71.05888 },
|
||||
areaServed: { '@type': 'Country', name: 'United States' },
|
||||
hasOfferCatalog: { '@id': `${BASE}/#services` },
|
||||
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',
|
||||
@@ -33,24 +51,27 @@ export const defaultJsonLdGraph: Record<string, unknown>[] = [
|
||||
name: 'Mike Fitzpatrick',
|
||||
jobTitle: 'Product Architect and Senior Software Engineer',
|
||||
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}/`,
|
||||
worksFor: { '@id': `${BASE}/#organization` },
|
||||
knowsAbout: [
|
||||
'Product Architecture',
|
||||
'Frontend Architecture',
|
||||
'UI Architecture',
|
||||
'React Development',
|
||||
'Web Performance Optimization',
|
||||
'Core Web Vitals',
|
||||
'Technical SEO',
|
||||
'Web Accessibility (WCAG)',
|
||||
'Component Libraries',
|
||||
'Design Systems',
|
||||
'JavaScript',
|
||||
'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',
|
||||
'Legacy System Modernization',
|
||||
'Fractional CTO',
|
||||
'Startup Infrastructure Strategy',
|
||||
'Code Refactoring',
|
||||
],
|
||||
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`,
|
||||
url: `${BASE}/`,
|
||||
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` },
|
||||
image: {
|
||||
'@type': 'ImageObject',
|
||||
url: WORDMARK,
|
||||
},
|
||||
potentialAction: {
|
||||
'@type': 'ReserveAction',
|
||||
target: {
|
||||
@@ -71,94 +96,86 @@ export const defaultJsonLdGraph: Record<string, unknown>[] = [
|
||||
name: 'Schedule a 30-minute intro call',
|
||||
},
|
||||
},
|
||||
{
|
||||
'@type': 'WebPage',
|
||||
'@id': `${BASE}/#webpage`,
|
||||
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',
|
||||
},
|
||||
];
|
||||
|
||||
export const catalogJsonLdGraph: Record<string, unknown>[] = [
|
||||
{
|
||||
'@type': 'ProfessionalService',
|
||||
'@id': `${BASE}/#professional-service`,
|
||||
name: 'mifi Ventures',
|
||||
url: `${BASE}/`,
|
||||
image: {
|
||||
'@type': 'ImageObject',
|
||||
url: WORDMARK,
|
||||
},
|
||||
logo: {
|
||||
'@type': 'ImageObject',
|
||||
url: WORDMARK,
|
||||
},
|
||||
telephone: PHONE,
|
||||
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: [
|
||||
'Product Architecture',
|
||||
'SaaS Engineering Consulting',
|
||||
'SaaS Product Architecture',
|
||||
'MVP Architecture and Launch Consulting',
|
||||
'Fractional CTO Services',
|
||||
'Startup Infrastructure Strategy',
|
||||
],
|
||||
provider: { '@id': `${BASE}/#organization` },
|
||||
address: {
|
||||
'@type': 'PostalAddress',
|
||||
addressLocality: 'Boston',
|
||||
addressRegion: 'MA',
|
||||
addressCountry: 'US',
|
||||
},
|
||||
areaServed: { '@type': 'Country', name: 'United States' },
|
||||
},
|
||||
{
|
||||
'@type': 'OfferCatalog',
|
||||
'@id': `${BASE}/#services`,
|
||||
name: 'Software Engineering Consulting Services',
|
||||
description: 'Consulting services offered by mifi Ventures',
|
||||
numberOfItems: 6,
|
||||
name: 'SaaS Architecture Services',
|
||||
description:
|
||||
'Consulting services offered by mifi Ventures for early-stage SaaS teams.',
|
||||
numberOfItems: 4,
|
||||
itemListElement: [
|
||||
{
|
||||
'@type': 'Offer',
|
||||
url: `${BASE}/hands-on-saas-architecture-consultant`,
|
||||
itemOffered: {
|
||||
'@type': 'Service',
|
||||
name: 'Frontend and UI Architecture',
|
||||
name: 'Hands-On SaaS Architecture',
|
||||
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',
|
||||
url: `${BASE}/mvp-architecture-and-launch`,
|
||||
itemOffered: {
|
||||
'@type': 'Service',
|
||||
name: 'Greenfield Product Development',
|
||||
name: 'MVP Architecture & Launch',
|
||||
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',
|
||||
url: `${BASE}/fractional-cto-for-early-stage-saas`,
|
||||
itemOffered: {
|
||||
'@type': 'Service',
|
||||
name: 'Performance Optimization',
|
||||
name: 'Fractional CTO / Technical Partner',
|
||||
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',
|
||||
url: `${BASE}/stage-aligned-infrastructure`,
|
||||
itemOffered: {
|
||||
'@type': 'Service',
|
||||
name: 'Accessibility Engineering',
|
||||
name: 'Stage-Aligned Infrastructure',
|
||||
description:
|
||||
'Accessibility-first engineering, ensuring WCAG-compliant interfaces with semantic markup, keyboard parity, and inclusive interaction patterns.',
|
||||
},
|
||||
},
|
||||
{
|
||||
'@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.',
|
||||
'Infrastructure strategy for early-stage SaaS teams that aligns cloud, SaaS, and deployment decisions with company stage, reducing unnecessary complexity and preserving runway.',
|
||||
},
|
||||
},
|
||||
],
|
||||
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(
|
||||
jsonLdScript
|
||||
? '<script type="application/ld+json">' + jsonLdScript + '</scr' + 'ipt>'
|
||||
? '<scr' + 'ipt type="application/ld+json">' + jsonLdScript + '</scr' + 'ipt>'
|
||||
: '',
|
||||
);
|
||||
</script>
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import type { PageLoad } from './$types';
|
||||
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 PATH = '/privacy-policy';
|
||||
@@ -10,17 +12,7 @@ const privacyPageMeta: PageMeta = {
|
||||
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.',
|
||||
canonical: PAGE_URL,
|
||||
jsonLd: [
|
||||
{
|
||||
'@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',
|
||||
},
|
||||
],
|
||||
jsonLd: [...baseJsonLdGraph, privacyPolicyPageJsonLdGraph],
|
||||
};
|
||||
|
||||
export const load: PageLoad = () => {
|
||||
|
||||
@@ -1,34 +1,21 @@
|
||||
import type { PageLoad } from './$types';
|
||||
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 { servicesPageJsonLdGraph } from '$lib/data/json-ld/webpageJsonLdGraphs';
|
||||
import { catalogJsonLdGraph } from '$lib/data/json-ld/baseJsonLdGraphs';
|
||||
|
||||
const BASE = 'https://mifi.ventures';
|
||||
const PAGE_URL = `${BASE}/services/`;
|
||||
const PATH = '/services';
|
||||
const PAGE_URL = `${BASE}${PATH}`;
|
||||
|
||||
export const load: PageLoad = () => {
|
||||
const { meta } = pageContent;
|
||||
const servicePageMeta: PageMeta = {
|
||||
title: meta.title,
|
||||
description: meta.description,
|
||||
jsonLd: [
|
||||
...defaultJsonLdGraph,
|
||||
{
|
||||
'@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' },
|
||||
},
|
||||
],
|
||||
canonical: PAGE_URL,
|
||||
jsonLd: [...baseJsonLdGraph, ...catalogJsonLdGraph, servicesPageJsonLdGraph],
|
||||
};
|
||||
return { meta: servicePageMeta };
|
||||
};
|
||||
|
||||
@@ -1,49 +1,24 @@
|
||||
import type { PageLoad } from './$types';
|
||||
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 { 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 PAGE_URL = `${BASE}/services/fractional-cto-for-early-stage-saas/`;
|
||||
|
||||
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,
|
||||
},
|
||||
})),
|
||||
};
|
||||
}
|
||||
const PATH = '/services/fractional-cto-for-early-stage-saas';
|
||||
const PAGE_URL = `${BASE}${PATH}`;
|
||||
|
||||
export const load: PageLoad = () => {
|
||||
const { meta } = pageContent;
|
||||
const servicePageMeta: PageMeta = {
|
||||
title: meta.title,
|
||||
description: meta.description,
|
||||
canonical: PAGE_URL,
|
||||
jsonLd: [
|
||||
...defaultJsonLdGraph,
|
||||
{
|
||||
'@type': 'ProfessionalService',
|
||||
'@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(),
|
||||
...baseJsonLdGraph,
|
||||
fractionalCtoForEarlyStageSaaSPageJsonLdGraph,
|
||||
fractionalCtoForEarlyStageSaaSServiceJsonLdGraph,
|
||||
],
|
||||
};
|
||||
return { meta: servicePageMeta };
|
||||
|
||||
@@ -1,49 +1,24 @@
|
||||
import type { PageLoad } from './$types';
|
||||
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 { 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 PAGE_URL = `${BASE}/services/hands-on-saas-architecture-consultant/`;
|
||||
|
||||
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,
|
||||
},
|
||||
})),
|
||||
};
|
||||
}
|
||||
const PATH = '/services/hands-on-saas-architecture-consultant';
|
||||
const PAGE_URL = `${BASE}${PATH}`;
|
||||
|
||||
export const load: PageLoad = () => {
|
||||
const { meta } = pageContent;
|
||||
const servicePageMeta: PageMeta = {
|
||||
title: meta.title,
|
||||
description: meta.description,
|
||||
canonical: PAGE_URL,
|
||||
jsonLd: [
|
||||
...defaultJsonLdGraph,
|
||||
{
|
||||
'@type': 'ProfessionalService',
|
||||
'@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(),
|
||||
...baseJsonLdGraph,
|
||||
handsOnSaaSArchitectureConsultantPageJsonLdGraph,
|
||||
handsOnSaaSArchitectureConsultantServiceJsonLdGraph,
|
||||
],
|
||||
};
|
||||
return { meta: servicePageMeta };
|
||||
|
||||
@@ -1,49 +1,24 @@
|
||||
import type { PageLoad } from './$types';
|
||||
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 { 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 PAGE_URL = `${BASE}/services/mvp-architecture-and-launch/`;
|
||||
|
||||
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,
|
||||
},
|
||||
})),
|
||||
};
|
||||
}
|
||||
const PATH = '/services/mvp-architecture-and-launch';
|
||||
const PAGE_URL = `${BASE}${PATH}`;
|
||||
|
||||
export const load: PageLoad = () => {
|
||||
const { meta } = pageContent;
|
||||
const servicePageMeta: PageMeta = {
|
||||
title: meta.title,
|
||||
description: meta.description,
|
||||
canonical: PAGE_URL,
|
||||
jsonLd: [
|
||||
...defaultJsonLdGraph,
|
||||
{
|
||||
'@type': 'ProfessionalService',
|
||||
'@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(),
|
||||
...baseJsonLdGraph,
|
||||
mvpArchitectureAndLaunchPageJsonLdGraph,
|
||||
mvpArchitectureAndLaunchServiceJsonLdGraph,
|
||||
],
|
||||
};
|
||||
return { meta: servicePageMeta };
|
||||
|
||||
@@ -1,49 +1,24 @@
|
||||
import type { PageLoad } from './$types';
|
||||
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 { 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 PAGE_URL = `${BASE}/services/stage-aligned-infrastructure/`;
|
||||
|
||||
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,
|
||||
},
|
||||
})),
|
||||
};
|
||||
}
|
||||
const PATH = '/services/stage-aligned-infrastructure';
|
||||
const PAGE_URL = `${BASE}${PATH}`;
|
||||
|
||||
export const load: PageLoad = () => {
|
||||
const { meta } = pageContent;
|
||||
const servicePageMeta: PageMeta = {
|
||||
title: meta.title,
|
||||
description: meta.description,
|
||||
canonical: PAGE_URL,
|
||||
jsonLd: [
|
||||
...defaultJsonLdGraph,
|
||||
{
|
||||
'@type': 'ProfessionalService',
|
||||
'@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(),
|
||||
...baseJsonLdGraph,
|
||||
stageAlignedInfrastructurePageJsonLdGraph,
|
||||
stageAlignedInfrastructureServiceJsonLdGraph,
|
||||
],
|
||||
};
|
||||
return { meta: servicePageMeta };
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import type { PageLoad } from './$types';
|
||||
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 PATH = '/terms-of-service';
|
||||
@@ -10,17 +12,7 @@ const termsPageMeta: PageMeta = {
|
||||
description:
|
||||
'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,
|
||||
jsonLd: [
|
||||
{
|
||||
'@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',
|
||||
},
|
||||
],
|
||||
jsonLd: [...baseJsonLdGraph, termsOfServicePageJsonLdGraph],
|
||||
};
|
||||
|
||||
export const load: PageLoad = () => {
|
||||
|
||||
Reference in New Issue
Block a user