Skip to content
96 changes: 82 additions & 14 deletions app/services/[slug]/ExpertisePageClient.tsx

Large diffs are not rendered by default.

10 changes: 9 additions & 1 deletion app/services/[slug]/ExpertisePageHero.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const heroCTAMap: Record<string, { text: string; href: string }> = {
"nextjs": { text: "Talk to a Next.js Engineer", href: "#book-call" },
"nodejs": { text: "Talk to a Node.js Engineer", href: "#book-call" },
"react": { text: "Talk to a React Engineer", href: "#book-call" },
"go": { text: "Talk to a Go Engineer", href: "#book-call" },
"python": { text: "Talk to a Python Engineer", href: "#book-call" },
"angular": { text: "Talk to an Angular Engineer", href: "#book-call" },
"flutter": { text: "Talk to a Flutter Engineer", href: "#book-call" },
Expand All @@ -19,7 +20,7 @@ const heroCTAMap: Record<string, { text: string; href: string }> = {

const noSecondaryCTASlugs = [
"ai-engineering", "ai-agents", "dotnet", "nextjs", "nodejs",
"react", "python", "angular", "flutter", "react-native",
"react", "go", "python", "angular", "flutter", "react-native",
"prometheus-monitoring", "istio-consulting", "thanos-long-term-storage",
];

Expand Down Expand Up @@ -90,6 +91,13 @@ const heroChildrenMap: Record<string, HeroChildrenConfig> = {
{ href: "#hire", text: "Need developers on your team?" },
],
},
"go": {
badges: ["Free architecture review", "30-minute call", "Talk to engineers, not sales"],
links: [
{ href: "#services", text: "Need a system built?" },
{ href: "#hire", text: "Need Go developers on your team?" },
],
},
"python": {
badges: ["Free architecture review", "30-minute call", "Talk to engineers, not sales"],
links: [
Expand Down
8 changes: 4 additions & 4 deletions app/services/[slug]/slug-sections/CustomStackTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -127,9 +127,9 @@ const dataMap: Record<string, StackData> = {
},
react: {
type: "three-column",
title: "Our",
highlight: "React",
afterHighlight: "Stack",
title: "React Technology",
highlight: "Stack",
afterHighlight: "We Use in Production",
subtitle:
"Every tool earns its place. Here\u2019s what we ship with and why.",
whyHeader: "Why",
Expand Down Expand Up @@ -196,7 +196,7 @@ const dataMap: Record<string, StackData> = {
},
],
bottomNote:
"We pick the tooling based on your project. A dashboard doesn\u2019t need Next.js and Vercel - React + Vite + CloudFront is faster to build and cheaper to run. A marketing site doesn\u2019t need Redux - server state with React Query is enough. The stack follows the problem.",
"Procedure picks the tooling based on your project. A dashboard doesn\u2019t need Next.js and Vercel - React + Vite + CloudFront is faster to build and cheaper to run. A marketing site doesn\u2019t need Redux - server state with React Query is enough. The stack follows the problem.",
},
python: {
type: "three-column",
Expand Down
5 changes: 3 additions & 2 deletions app/services/[slug]/slug-sections/FrameworkComparison.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ const comparisonDataMap: Record<string, ComparisonData> = {
],
bottomNote: (
<>
Many projects use both. A public marketing site on Next.js, an
authenticated dashboard on React + Vite, sharing the same component
Many projects use both. A public marketing site on{" "}
<a href="/technologies/nextjs/" className="text-accent hover:text-accent-light">Next.js</a>
, an authenticated dashboard on React + Vite, sharing the same component
library and design system. We architect for this pattern regularly.
</>
),
Expand Down
2 changes: 2 additions & 0 deletions app/services/[slug]/slug-sections/IntroStatement.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ const introStatements: Record<string, string> = {
"Procedure is a React Native development company that builds high-performance cross-platform mobile applications for fintech, media, and consumer-facing products where native-quality UX is a hard requirement. Since 2016, Procedure has shipped React Native apps processing real-time data, secure transactions, and media streams for clients including ESPN and KredX.",
dotnet:
"Procedure is a .NET development company that builds secure, high-availability backend systems, payment processing platforms, and enterprise APIs on the Microsoft stack. Since 2016, Procedure has delivered .NET solutions handling mission-critical transaction volumes for clients in payments, telecom, and fintech, including Pine Labs and MCLabs.",
go:
"Procedure is a software engineering consultancy based in Mumbai and San Francisco that builds Go microservices, APIs, and cloud-native infrastructure for product and platform teams.",
};

export default function IntroStatement({ slug }: { slug: string }) {
Expand Down
81 changes: 38 additions & 43 deletions app/services/[slug]/slug-sections/TechDecisionTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ const dataMap: Record<string, TechDecisionData> = {
},
react: {
sectionId: "decision",
title: "Is React Right for Your",
highlight: "Project?",
subtitle: "The most popular frontend library isn\u2019t always the right one.",
title: "When to Choose React for Your",
highlight: "Project",
subtitle: "React is the most widely adopted frontend library in professional software development, with the largest ecosystem of third-party packages, component libraries, and developer tooling of any frontend technology. But the most popular library isn\u2019t always the right one.",
cards: [
{
label: "Dynamic, interaction-heavy UIs (dashboards, editors, tools)",
Expand All @@ -89,46 +89,41 @@ const dataMap: Record<string, TechDecisionData> = {
},
],
bottomNote: (
<p className="text-sm text-text-muted max-w-3xl mx-auto leading-relaxed">
If SEO and page speed are your top priority,{" "}
<a
href="/technologies/nextjs/"
className="text-accent hover:text-accent-light"
>
Next.js
</a>{" "}
gives you server-side rendering, static generation, and edge functions
built on React. For structured enterprise apps with strict conventions,{" "}
<a
href="/technologies/angular/"
className="text-accent hover:text-accent-light"
>
Angular
</a>{" "}
provides routing, forms, and dependency injection out of the box. Need a
lightweight backend to pair with React?{" "}
<a
href="/technologies/nodejs/"
className="text-accent hover:text-accent-light"
>
Node.js
</a>{" "}
or{" "}
<a
href="/technologies/python/"
className="text-accent hover:text-accent-light"
>
Python
</a>{" "}
depending on your workload. Not sure? That&apos;s what our{" "}
<a
href="#book-call"
className="text-accent hover:text-accent-light"
>
architecture consultation
</a>{" "}
is for.
</p>
<div className="text-left max-w-3xl mx-auto">
<h3 className="text-lg font-semibold text-text-primary mb-4">
Choosing the Right Approach for Your Project
</h3>
<div className="space-y-3 text-sm text-text-muted leading-relaxed">
<p>
Some projects start as &ldquo;we need a React app&rdquo; but turn out to need something slightly different. Here&apos;s how we help teams land on the right approach:
</p>
<p>
If your project needs strong SEO and server-side rendering, we typically recommend{" "}
<a href="/technologies/nextjs/" className="text-accent hover:text-accent-light">Next.js</a>
{" "}- which is built on React, so your team still writes React components.
</p>
<p>
If you need a cross-platform mobile app alongside your web app,{" "}
<a href="/technologies/react-native/" className="text-accent hover:text-accent-light">React Native</a>
{" "}lets you share code across both.
</p>
<p>
If your enterprise already runs{" "}
<a href="/technologies/angular/" className="text-accent hover:text-accent-light">Angular</a>
{" "}and wants consistency across teams, extending that investment can make more sense than introducing a new framework.
</p>
<p>
Need a lightweight backend to pair with React?{" "}
<a href="/technologies/nodejs/" className="text-accent hover:text-accent-light">Node.js</a>
{" "}or{" "}
<a href="/technologies/python/" className="text-accent hover:text-accent-light">Python</a>
{" "}depending on your workload.
</p>
<p>
We&apos;ll always recommend what fits your situation. That&apos;s what the free architecture review is for.
</p>
</div>
</div>
),
},
python: {
Expand Down
36 changes: 36 additions & 0 deletions app/technologies/go/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import type { Metadata } from "next";

export const metadata: Metadata = {
title:
"Go Development Services | High-Performance APIs & Cloud-Native Systems",
description:
"Go development services for APIs, microservices, and cloud-native backends. Engineers who ship production Go on Kubernetes. Architecture review included.",
alternates: {
canonical: "/technologies/go",
},
openGraph: {
title:
"Go Development Services | High-Performance APIs & Cloud-Native Systems",
description:
"Go development services for APIs, microservices, and cloud-native backends. Engineers who ship production Go on Kubernetes. Architecture review included.",
type: "website",
url: "/technologies/go",
},
twitter: {
card: "summary_large_image",
title:
"Go Development Services | High-Performance APIs & Cloud-Native Systems",
description:
"Go development services for APIs, microservices, and cloud-native backends. Engineers who ship production Go on Kubernetes. Architecture review included.",
site: "@procedurehq",
creator: "@procedurehq",
},
};

export default function GoLayout({
children,
}: {
children: React.ReactNode;
}) {
return <>{children}</>;
}
28 changes: 28 additions & 0 deletions app/technologies/go/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { notFound } from "next/navigation";
import {
getTechnologyForListing,
getRelatedExpertiseForListing,
} from "@/lib/content";
import ExpertisePageClient from "@/app/services/[slug]/ExpertisePageClient";
import { ExpertisePageHero } from "@/app/services/[slug]/ExpertisePageHero";

export default function GoPage() {
const technology = getTechnologyForListing("go");

if (!technology) {
notFound();
}

const relatedPages = getRelatedExpertiseForListing(
technology.relatedExpertise || [],
);

return (
<ExpertisePageClient
expertise={technology}
relatedPages={relatedPages}
basePath="/technologies"
heroSlot={<ExpertisePageHero expertise={technology} />}
/>
);
}
6 changes: 3 additions & 3 deletions app/technologies/react/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ export const metadata: Metadata = {
title:
"React Development Services | 75+ Clients, 9+ Years",
description:
"React development services for web applications, SPAs, dashboards, and component libraries. React 19, TypeScript, production-tested. Talk to engineers, not sales.",
"React development services for web apps, SPAs, and enterprise dashboards. React 19, TypeScript, free architecture review. Talk to engineers, not sales.",
alternates: {
canonical: "/technologies/react",
},
openGraph: {
title:
"React Development Services | 75+ Clients, 9+ Years",
description:
"React development services for web applications, SPAs, and dashboards. React 19, TypeScript, production-tested. Talk to engineers, not sales.",
"React development services for web apps, SPAs, and enterprise dashboards. React 19, TypeScript, free architecture review. Talk to engineers, not sales.",
type: "website",
url: "/technologies/react",
},
Expand All @@ -21,7 +21,7 @@ export const metadata: Metadata = {
title:
"React Development Services | 75+ Clients, 9+ Years",
description:
"React development services for web applications, SPAs, and dashboards. React 19, TypeScript, production-tested. Talk to engineers, not sales.",
"React development services for web apps, SPAs, and enterprise dashboards. React 19, TypeScript, free architecture review. Talk to engineers, not sales.",
site: "@procedurehq",
creator: "@procedurehq",
},
Expand Down
3 changes: 2 additions & 1 deletion components/expertise/ProcessTimeline.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { m } from "framer-motion";
import { cn } from "@/lib/utils";
import { ReactNode } from "react";
import { renderLinkedText } from "@/lib/render-linked-text";

interface ProcessStep {
number: number;
Expand Down Expand Up @@ -123,7 +124,7 @@ export function ProcessTimeline({
</h3>
</div>
<p className="text-text-secondary leading-relaxed max-w-2xl">
{step.description}
{renderLinkedText(step.description)}
</p>
</div>

Expand Down
3 changes: 2 additions & 1 deletion components/expertise/RelatedExpertise.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { m } from "framer-motion";
import Link from "next/link";
import { renderLinkedText } from "@/lib/render-linked-text";

interface RelatedPage {
slug: string;
Expand Down Expand Up @@ -79,7 +80,7 @@ export function RelatedExpertise({
</h3>

<p className="text-sm text-text-secondary leading-relaxed mb-4">
{page.description}
{renderLinkedText(page.description)}
</p>

<div className="flex items-center text-sm text-accent-light font-medium">
Expand Down
2 changes: 1 addition & 1 deletion content/services/frontend-development.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: "Frontend Development Services"
headline: "Frontend Development Services"
headlineAccent: "for Modern Product Teams"
tagline: "Premium frontend engineering optimized for performance, SEO, and scale."
tagline: "Premium frontend engineering optimized for performance, SEO, and scale. [Explore all frontend services](/services/frontend-development/)."
description: |
Premium frontend development for product-led teams. React, Next.js, and Angular — component libraries, design systems, and performance optimization at scale.
capabilities:
Expand Down
Loading
Loading