From 9b68a2795d82891c1d35edddf3dc88d6a78a5df9 Mon Sep 17 00:00:00 2001 From: harshita375 Date: Mon, 23 Feb 2026 01:16:04 +0530 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20.NET=20staff=20augmentation=20page?= =?UTF-8?q?=20=E2=80=94=20H2=20keyword=20optimization,=20pricing,=20compar?= =?UTF-8?q?ison=20table,=20internal=20links?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Optimize H2 headings for target keywords (What You Get, Senior .NET Developer Skills) - Update section title to "When Does .NET Staff Augmentation Make Sense?" - Add detailed pricing info ($30-$65/hr) to rates FAQ - Add 3 new FAQs: staff aug vs outsourcing, short-term projects, engagement duration - Add comparison table: Staff Augmentation vs Full-Time Hiring - Add typical duration lines to engagement model cards - Update copy with Procedure branding (Mumbai/SF offices, Procedure's team) - Add internal links: ASP.NET Core, .NET modernization, cloud services, fintech - Update meta title to Procedure.tech Co-Authored-By: Claude Opus 4.6 --- .../DotnetStaffAugPageClient.tsx | 6 ++ .../dotnet/staff-augmentation/layout.tsx | 6 +- components/expertise/FAQSection.tsx | 3 +- components/technologies/ComparisonTable.tsx | 84 ++++++++++++++++ components/technologies/EngagementModels.tsx | 8 ++ components/technologies/ProblemSignals.tsx | 3 +- components/technologies/ServiceFeatures.tsx | 7 +- components/technologies/UseCaseStories.tsx | 3 +- components/technologies/index.ts | 1 + lib/dotnet-staff-augmentation-data.ts | 96 ++++++++++++++++--- lib/render-linked-text.tsx | 58 +++++++++++ 11 files changed, 252 insertions(+), 23 deletions(-) create mode 100644 components/technologies/ComparisonTable.tsx create mode 100644 lib/render-linked-text.tsx diff --git a/app/technologies/dotnet/staff-augmentation/DotnetStaffAugPageClient.tsx b/app/technologies/dotnet/staff-augmentation/DotnetStaffAugPageClient.tsx index 247ec988..c1e16721 100644 --- a/app/technologies/dotnet/staff-augmentation/DotnetStaffAugPageClient.tsx +++ b/app/technologies/dotnet/staff-augmentation/DotnetStaffAugPageClient.tsx @@ -10,6 +10,7 @@ import { SkillsTable, UseCaseStories, EngagementModels, + ComparisonTable, RelatedDotnetServices, } from "@/components/technologies"; import { @@ -29,6 +30,8 @@ import { whyProcedure, engagementModelsTitle, engagementModels, + comparisonTitle, + comparisonRows, faqs, ctaData, relatedServices, @@ -219,6 +222,9 @@ export default function DotnetStaffAugPageClient() { models={engagementModels} /> + {/* Comparison Table */} + + {/* CTA Section with Cal.com Embed */}

- {faq.answer} + {renderLinkedText(faq.answer)}

diff --git a/components/technologies/ComparisonTable.tsx b/components/technologies/ComparisonTable.tsx new file mode 100644 index 00000000..87eaa588 --- /dev/null +++ b/components/technologies/ComparisonTable.tsx @@ -0,0 +1,84 @@ +"use client"; + +import { m } from "framer-motion"; +import { cn } from "@/lib/utils"; + +interface ComparisonRow { + factor: string; + fullTimeHire: string; + staffAug: string; +} + +interface ComparisonTableProps { + title?: string; + rows: ComparisonRow[]; +} + +export function ComparisonTable({ + title = "Staff Augmentation vs Full-Time Hiring", + rows, +}: ComparisonTableProps) { + return ( +
+
+ +

+ {title} +

+
+ + + + + + + + + + + + {rows.map((row, index) => ( + + + + + + ))} + +
+ Factor + + Full-Time .NET Hire + + Staff Aug with Procedure +
+ {row.factor} + + {row.fullTimeHire} + + {row.staffAug} +
+
+
+
+ ); +} diff --git a/components/technologies/EngagementModels.tsx b/components/technologies/EngagementModels.tsx index 799f71b3..b48e117f 100644 --- a/components/technologies/EngagementModels.tsx +++ b/components/technologies/EngagementModels.tsx @@ -8,6 +8,7 @@ interface EngagementModel { description: string; teamSize?: string; bestFor?: string; + typicalDuration?: string; } interface EngagementModelsProps { @@ -108,6 +109,13 @@ export function EngagementModels({

{model.description}

+ + {/* Typical Duration */} + {model.typicalDuration && ( +

+ {model.typicalDuration} +

+ )} ))} diff --git a/components/technologies/ProblemSignals.tsx b/components/technologies/ProblemSignals.tsx index 89f18b14..a172e189 100644 --- a/components/technologies/ProblemSignals.tsx +++ b/components/technologies/ProblemSignals.tsx @@ -4,6 +4,7 @@ import { m } from "framer-motion"; import { ReactNode } from "react"; import { cn } from "@/lib/utils"; import { Icons } from "@/lib/expertise-data"; +import { renderLinkedText } from "@/lib/render-linked-text"; interface Signal { title: string; @@ -105,7 +106,7 @@ export function ProblemSignals({ {signal.title}

- {signal.description} + {renderLinkedText(signal.description)}

diff --git a/components/technologies/ServiceFeatures.tsx b/components/technologies/ServiceFeatures.tsx index 406c96d5..fdf5c934 100644 --- a/components/technologies/ServiceFeatures.tsx +++ b/components/technologies/ServiceFeatures.tsx @@ -4,6 +4,7 @@ import { m } from "framer-motion"; import { ReactNode } from "react"; import { cn } from "@/lib/utils"; import { Icons } from "@/lib/expertise-data"; +import { renderLinkedText } from "@/lib/render-linked-text"; interface ServiceFeature { title: string; @@ -79,7 +80,7 @@ function EditorialCard({ {/* Description */}

- {feature.description} + {renderLinkedText(feature.description)}

{/* Optional items in 2-column grid */} @@ -103,7 +104,7 @@ function EditorialCard({ d="M8.25 4.5l7.5 7.5-7.5 7.5" /> - {item} + {renderLinkedText(item)} ))} @@ -150,7 +151,7 @@ function CompactCard({ feature }: { feature: ServiceFeature }) { {/* Description */}

- {feature.description} + {renderLinkedText(feature.description)}

diff --git a/components/technologies/UseCaseStories.tsx b/components/technologies/UseCaseStories.tsx index b32baa11..a966a0d5 100644 --- a/components/technologies/UseCaseStories.tsx +++ b/components/technologies/UseCaseStories.tsx @@ -4,6 +4,7 @@ import { m } from "framer-motion"; import { ReactNode } from "react"; import { cn } from "@/lib/utils"; import { Icons } from "@/lib/expertise-data"; +import { renderLinkedText } from "@/lib/render-linked-text"; interface UseCase { title: string; @@ -116,7 +117,7 @@ export function UseCaseStories({ {/* Description */}

- {useCase.description} + {renderLinkedText(useCase.description)}

{/* Outcome bar */} diff --git a/components/technologies/index.ts b/components/technologies/index.ts index e6a0c29b..55786f8c 100644 --- a/components/technologies/index.ts +++ b/components/technologies/index.ts @@ -7,3 +7,4 @@ export { ServiceFeatures } from "./ServiceFeatures"; export { SkillsTable } from "./SkillsTable"; export { UseCaseStories } from "./UseCaseStories"; export { EngagementModels } from "./EngagementModels"; +export { ComparisonTable } from "./ComparisonTable"; diff --git a/lib/dotnet-staff-augmentation-data.ts b/lib/dotnet-staff-augmentation-data.ts index 3fdfff33..d332efa1 100644 --- a/lib/dotnet-staff-augmentation-data.ts +++ b/lib/dotnet-staff-augmentation-data.ts @@ -52,22 +52,22 @@ export const problemSignals: ProblemSignal[] = [ { title: "Modernization skills gap", description: - "You are modernizing legacy .NET Framework applications and need specialized skills", + "You are modernizing [legacy .NET Framework](/technologies/dotnet/modernization) applications and need specialized skills", icon: "cog", }, { title: "Cloud-native expertise", description: - "You require Azure or cloud-native .NET experience your team lacks", + "You require [Azure or cloud-native](/services/cloud) .NET experience your team lacks", icon: "cloud", }, ]; export const problemTitle = - "Why Engineering Teams Choose .NET Staff Augmentation"; + "When Does .NET Staff Augmentation Make Sense?"; export const problemIntro = - "Hiring a senior .NET engineer takes 4 to 6 months. Staff augmentation gives you production-ready .NET talent who contribute from week one."; + "Hiring a senior .NET engineer takes 4 to 6 months. Procedure's staff augmentation gives you production-ready .NET talent who contribute from week one."; // ============================================================================= // What You Get (Service Features) @@ -83,13 +83,13 @@ export const serviceFeatures: ServiceFeature[] = [ { title: "Senior Engineers Only", description: - "Every .NET developer in our team has shipped production applications. They have worked with enterprise codebases, handled complex integrations, and solved the kinds of problems that only come from years of real-world experience. No junior developers learning on your project.", + "Every .NET developer in our team has a minimum of 5 years of production experience, shipping real applications for enterprise clients. They have worked with large-scale codebases, handled complex integrations, and solved the kinds of problems that only come with years in production environments. No junior developers learning on your project.", }, { title: "Full .NET Stack Coverage", description: "Our engineers work across the entire .NET ecosystem.", items: [ - "Backend: ASP.NET Core, .NET 8, Entity Framework Core, Dapper", + "Backend: [ASP.NET Core](/technologies/dotnet/), .NET 8, Entity Framework Core, Dapper", "Frontend: Blazor, Razor Pages, integration with React and Angular", "Cloud: Azure App Service, Azure Functions, Azure SQL, Azure DevOps", "Desktop: WPF, WinForms, .NET MAUI for cross-platform", @@ -104,7 +104,7 @@ export const serviceFeatures: ServiceFeature[] = [ ]; export const serviceFeaturesTitle = - "What Our .NET Staff Augmentation Includes"; + "What You Get with .NET Staff Augmentation"; // ============================================================================= // How It Works (for ProcessTimeline component) @@ -127,7 +127,7 @@ export const approachSteps: ApproachStep[] = [ number: 2, title: "Candidate Matching (1 to 2 days)", description: - "Based on your requirements, we present senior .NET developers who match your needs. You receive detailed profiles covering their technical expertise, project history, and relevant experience.", + "Based on your requirements, we present senior .NET developers from Procedure's engineering team who match your needs. You receive detailed profiles covering their technical expertise, project history, and relevant experience.", }, { number: 3, @@ -160,7 +160,7 @@ export interface SkillEntry { } export const skillsTitle = - ".NET Skills Available Through Staff Augmentation"; + "Senior .NET Developer Skills & Experience Levels"; export const skillsTable: SkillEntry[] = [ { @@ -230,7 +230,7 @@ export const useCases: UseCase[] = [ { title: "Specialized Expertise", description: - "An enterprise with a large .NET Framework codebase wanted to modernize to .NET 8 without disrupting operations. Their team knew the business logic but lacked migration experience. We provided two developers with specific experience in incremental modernization strategies. They worked alongside the internal team, transferring knowledge while executing the migration.", + "An enterprise with a large .NET Framework codebase wanted to [modernize to .NET 8](/technologies/dotnet/modernization) without disrupting operations. Their team knew the business logic but lacked migration experience. We provided two developers with specific experience in incremental modernization strategies. They worked alongside the internal team, transferring knowledge while executing the migration.", category: "Enterprise", highlight: "Incremental migration without disruption", icon: "cog", @@ -262,7 +262,7 @@ export const whyProcedure: ValueProp[] = [ { title: "Production Experience", description: - "Our .NET developers come from building products, not just completing coursework. They have worked on payment systems, healthcare platforms, fintech applications, and enterprise integrations. When they join your team, they bring patterns and practices from real production environments.", + "Procedure's .NET developers come from building products, not just completing coursework. They have worked on [payment systems](/industries/financial-services), healthcare platforms, [fintech applications](/industries/financial-services), and enterprise integrations. When they join your team, they bring patterns and practices from real production environments.", icon: "code", }, { @@ -274,7 +274,7 @@ export const whyProcedure: ValueProp[] = [ { title: "Same Timezone Collaboration", description: - "With teams in India and access to developers across timezones, we structure engagements for meaningful overlap with your working hours. Daily standups, real-time collaboration, and quick responses are standard, not exceptions.", + "With engineering teams in Mumbai and San Francisco and access to developers across timezones, we structure engagements for meaningful overlap with your working hours. Daily standups, real-time collaboration, and quick responses are standard, not exceptions.", icon: "globe", }, { @@ -294,6 +294,7 @@ export interface EngagementModel { description: string; teamSize: string; bestFor: string; + typicalDuration?: string; } export const engagementModelsTitle = @@ -306,6 +307,7 @@ export const engagementModels: EngagementModel[] = [ "Add a single senior .NET developer to your existing team. They participate in your standups, follow your processes, and report to your technical lead. Best for filling specific skill gaps or adding capacity to an established team.", teamSize: "1", bestFor: "Skill gaps & capacity boost", + typicalDuration: "Typical duration: 3-6 months", }, { title: "Pod Model", @@ -313,6 +315,7 @@ export const engagementModels: EngagementModel[] = [ "Bring in a small, self-contained unit: typically a senior developer and a mid-level developer who work together. The senior developer provides technical leadership while both contribute to delivery. Best for projects that need more than one person but not a full team.", teamSize: "2", bestFor: "Focused project delivery", + typicalDuration: "Typical duration: 4-12 months", }, { title: "Extended Team", @@ -320,6 +323,53 @@ export const engagementModels: EngagementModel[] = [ "Augment with multiple developers across different seniority levels, potentially including QA and DevOps expertise. We can include a technical lead who coordinates the augmented team's work. Best for significant initiatives where you need substantial capacity.", teamSize: "3+", bestFor: "Large-scale initiatives", + typicalDuration: "Typical duration: 6-18 months", + }, +]; + +// ============================================================================= +// Comparison Table (Staff Augmentation vs Full-Time Hiring) +// ============================================================================= + +export interface ComparisonRow { + factor: string; + fullTimeHire: string; + staffAug: string; +} + +export const comparisonTitle = + "Staff Augmentation vs Full-Time Hiring: What Makes Sense?"; + +export const comparisonRows: ComparisonRow[] = [ + { + factor: "Time to start", + fullTimeHire: "4-6 months (recruiting + onboarding)", + staffAug: "5 business days", + }, + { + factor: "Annual cost (senior)", + fullTimeHire: "$150K-$200K+ (total comp)", + staffAug: "Flexible - pay only for what you use", + }, + { + factor: "Commitment", + fullTimeHire: "Long-term headcount", + staffAug: "Month-to-month after initial period", + }, + { + factor: "Scaling", + fullTimeHire: "New hire per person needed", + staffAug: "Add or reduce capacity in days", + }, + { + factor: "Risk if project changes", + fullTimeHire: "Layoff or redeployment", + staffAug: "Adjust engagement scope", + }, + { + factor: "Best for", + fullTimeHire: "Core team, long-term product roles", + staffAug: "Project-specific needs, capacity bursts, specialized skills", }, ]; @@ -336,7 +386,7 @@ export const faqs: FAQ[] = [ { question: "How quickly can .NET developers start?", answer: - "Typically within 5 business days of your selection. We maintain a bench of available senior .NET developers specifically to enable fast starts. For specialized requirements, matching may take 1 to 2 weeks.", + "Procedure's .NET developers can start within 5 business days of your selection. We maintain a bench of senior .NET developers from our Mumbai and San Francisco offices specifically to enable fast starts. For specialized requirements like legacy migration expertise, matching may take 1 to 2 weeks.", }, { question: "What if the developer is not the right fit?", @@ -356,7 +406,7 @@ export const faqs: FAQ[] = [ { question: "What are the typical rates for .NET staff augmentation?", answer: - "Rates vary based on seniority, specific skills, and engagement duration. Contact us for a detailed quote based on your requirements. We provide transparent pricing with no hidden fees.", + ".NET staff augmentation rates at Procedure range from $30 to $65 per hour depending on seniority level, engagement model, and duration. Individual senior .NET developers typically fall in the $40 to $60/hour range for engagements of 3 months or longer. Pod model and extended team engagements are priced per team rather than per developer, and longer commitments come with better rates. We provide a detailed cost breakdown after the initial requirements discussion - no hidden fees or surprise markups. [Talk to our team](/contact-us) for a quote tailored to your project.", }, { question: "Do developers work exclusively on my project?", @@ -373,6 +423,24 @@ export const faqs: FAQ[] = [ answer: "Yes. Many of our .NET developers have specific experience migrating .NET Framework applications to .NET 8. They can work alongside your team to execute modernization while transferring knowledge.", }, + { + question: + "What is the difference between .NET staff augmentation and outsourcing?", + answer: + "Staff augmentation and outsourcing solve different problems. With .NET staff augmentation, Procedure's developers join your existing team - they attend your standups, use your tools, and report to your technical lead. You retain full control over architecture decisions, code reviews, and priorities. With outsourcing, you hand off an entire project or workstream to an external team that manages itself. Staff augmentation is the better fit when you have a strong engineering culture and need to add specific skills or capacity without giving up control. Outsourcing works when you want to delegate a self-contained deliverable and don't want to manage the team directly. Most of our .NET clients choose staff augmentation because their CTOs want to maintain code quality standards and architectural consistency across the codebase.", + }, + { + question: + "Can I hire a .NET developer for a short-term project (under 3 months)?", + answer: + "Yes. While our most common .NET staff augmentation engagements run 3 to 12 months, we regularly support shorter projects - particularly for deadline-driven deliverables, migration sprints, or proof-of-concept work. For engagements under 3 months, we recommend the individual developer model where one senior .NET developer integrates with your team for a focused initiative. The minimum engagement is typically 4 weeks. Short-term engagements follow the same process: requirements discussion, candidate matching within 48 hours, and onboarding within 5 business days.", + }, + { + question: + "How long do .NET staff augmentation engagements typically last?", + answer: + "Most .NET staff augmentation engagements at Procedure run between 3 and 12 months, though we support everything from 4-week sprints to multi-year partnerships. The most common pattern: a client starts with one senior developer for 3 months, then extends or expands as the working relationship proves out. There are no long-term lock-ins - engagements renew monthly after an initial commitment period. About 70% of our staff augmentation clients extend beyond their original timeline.", + }, ]; // ============================================================================= diff --git a/lib/render-linked-text.tsx b/lib/render-linked-text.tsx new file mode 100644 index 00000000..97c35265 --- /dev/null +++ b/lib/render-linked-text.tsx @@ -0,0 +1,58 @@ +import Link from "next/link"; +import { ReactNode } from "react"; + +/** + * Parses markdown-style links [text](url) in a string and returns + * React nodes with Next.js Link components for internal links. + */ +export function renderLinkedText(text: string): ReactNode { + const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g; + const parts: ReactNode[] = []; + let lastIndex = 0; + let match: RegExpExecArray | null; + + while ((match = linkRegex.exec(text)) !== null) { + // Add text before the link + if (match.index > lastIndex) { + parts.push(text.slice(lastIndex, match.index)); + } + + const linkText = match[1]; + const href = match[2]; + const isInternal = href.startsWith("/"); + + parts.push( + isInternal ? ( + + {linkText} + + ) : ( + + {linkText} + + ) + ); + + lastIndex = match.index + match[0].length; + } + + // Add remaining text + if (lastIndex < text.length) { + parts.push(text.slice(lastIndex)); + } + + // If no links were found, return the original string + if (parts.length === 0) return text; + + return <>{parts}; +} From 5f9d5175c87e62ef969003c7dc448caa36001a02 Mon Sep 17 00:00:00 2001 From: harshita375 Date: Mon, 23 Feb 2026 02:02:43 +0530 Subject: [PATCH 2/5] feat: .NET modernization page - version freshness, AEO claims, entity mentions, internal links MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Meta title: .NET 8/10 + Procedure.tech branding - Hero: "modern .NET" instead of ".NET 8" - Migration table: added .NET 8 → .NET 10 row + two-stage approach note - Performance card: TechEmpower benchmark attribution - Discovery step: front-loaded pricing ($5K-$15K) + .NET Upgrade Assistant - Pricing FAQ: summary lead sentence + updated tier labels - Strangler Fig card: zero planned downtime claim - Entity mentions: "Procedure" woven into steps 01/03/05 and risk cards - H2s: "Is Your Legacy .NET Framework Holding You Back?" + "How .NET Modernization Works at Procedure" - New FAQ: "Should we migrate to .NET 8, 9, or 10?" - New FAQ: "Should we rewrite or migrate incrementally?" - Compatibility card: .NET Upgrade Assistant + API Portability Analyzer - 6 contextual internal links via renderLinkedText in MigrationPathsTable and TechnicalCapabilities Co-Authored-By: Claude Opus 4.6 --- .../DotnetModernizationPageClient.tsx | 4 +- .../dotnet/modernization/layout.tsx | 12 ++--- .../technologies/MigrationPathsTable.tsx | 5 +- .../technologies/TechnicalCapabilities.tsx | 3 +- lib/dotnet-modernization-data.ts | 51 ++++++++++++------- 5 files changed, 47 insertions(+), 28 deletions(-) diff --git a/app/technologies/dotnet/modernization/DotnetModernizationPageClient.tsx b/app/technologies/dotnet/modernization/DotnetModernizationPageClient.tsx index 6ffbc50a..576059a3 100644 --- a/app/technologies/dotnet/modernization/DotnetModernizationPageClient.tsx +++ b/app/technologies/dotnet/modernization/DotnetModernizationPageClient.tsx @@ -177,7 +177,7 @@ export default function DotnetModernizationPageClient() { {/* Problem Signals Section */} @@ -192,7 +192,7 @@ export default function DotnetModernizationPageClient() { {/* Approach / Process Timeline */} diff --git a/app/technologies/dotnet/modernization/layout.tsx b/app/technologies/dotnet/modernization/layout.tsx index 4acfa514..233f2b2c 100644 --- a/app/technologies/dotnet/modernization/layout.tsx +++ b/app/technologies/dotnet/modernization/layout.tsx @@ -2,17 +2,17 @@ import type { Metadata } from "next"; export const metadata: Metadata = { title: - ".NET Modernization Services | Migrate .NET Framework to .NET 8 | Procedure", + ".NET Modernization Services | Migrate .NET Framework to .NET 8/10 | Procedure.tech", description: - "Migrate legacy .NET Framework applications to .NET 8 with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.", + "Migrate legacy .NET Framework applications to modern .NET with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.", alternates: { canonical: "/technologies/dotnet/modernization", }, openGraph: { title: - ".NET Modernization Services | Migrate .NET Framework to .NET 8 | Procedure", + ".NET Modernization Services | Migrate .NET Framework to .NET 8/10 | Procedure.tech", description: - "Migrate legacy .NET Framework applications to .NET 8 with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.", + "Migrate legacy .NET Framework applications to modern .NET with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.", type: "website", url: "/technologies/dotnet/modernization", images: [ @@ -27,9 +27,9 @@ export const metadata: Metadata = { twitter: { card: "summary_large_image", title: - ".NET Modernization Services | Migrate .NET Framework to .NET 8 | Procedure", + ".NET Modernization Services | Migrate .NET Framework to .NET 8/10 | Procedure.tech", description: - "Migrate legacy .NET Framework applications to .NET 8 with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.", + "Migrate legacy .NET Framework applications to modern .NET with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.", images: [ { url: "/assets/technologies/dotnet-migration.png", diff --git a/components/technologies/MigrationPathsTable.tsx b/components/technologies/MigrationPathsTable.tsx index 13f47948..69e625fa 100644 --- a/components/technologies/MigrationPathsTable.tsx +++ b/components/technologies/MigrationPathsTable.tsx @@ -2,6 +2,7 @@ import { m } from "framer-motion"; import { cn } from "@/lib/utils"; +import { renderLinkedText } from "@/lib/render-linked-text"; interface MigrationPath { from: string; @@ -119,7 +120,7 @@ export function MigrationPathsTable({ {path.from} - {path.to} + {renderLinkedText(path.to)} @@ -183,7 +184,7 @@ export function MigrationPathsTable({ To

- {path.to} + {renderLinkedText(path.to)}

diff --git a/components/technologies/TechnicalCapabilities.tsx b/components/technologies/TechnicalCapabilities.tsx index d7079513..af8d34fb 100644 --- a/components/technologies/TechnicalCapabilities.tsx +++ b/components/technologies/TechnicalCapabilities.tsx @@ -2,6 +2,7 @@ import { m } from "framer-motion"; import { cn } from "@/lib/utils"; +import { renderLinkedText } from "@/lib/render-linked-text"; interface CapabilityGroup { title: string; @@ -98,7 +99,7 @@ export function TechnicalCapabilities({ d="M8.25 4.5l7.5 7.5-7.5 7.5" /> - {item} + {renderLinkedText(item)} ))} diff --git a/lib/dotnet-modernization-data.ts b/lib/dotnet-modernization-data.ts index 6ee70a15..3160025b 100644 --- a/lib/dotnet-modernization-data.ts +++ b/lib/dotnet-modernization-data.ts @@ -8,7 +8,7 @@ export const heroData = { headlineAccent: "", tagline: "", description: - "Migrate your legacy .NET Framework applications to .NET 8 with confidence. We handle the complexity so you can focus on your business.", + "Migrate your legacy .NET Framework applications to modern .NET with confidence. We handle the complexity so you can focus on your business.", primaryCTA: { text: "Get Free Migration Assessment", href: "/contact-us", @@ -39,13 +39,13 @@ export const problemSignals: ProblemSignal[] = [ { title: "Rising maintenance costs", description: - "Finding developers who want to work on legacy .NET is getting harder (and more expensive). Your best engineers are leaving for teams that use modern stacks.", + "[Finding developers who want to work on legacy .NET is getting harder](/technologies/dotnet/staff-augmentation) (and more expensive). Your best engineers are leaving for teams that use modern stacks.", icon: "chart", }, { title: "Deployment friction", description: - "Windows-only hosting. No containerization. Manual deployments. Your competitors are shipping features while you're fighting infrastructure.", + "Windows-only hosting. No [containerization](/services/kubernetes). Manual deployments. Your competitors are shipping features while you're fighting infrastructure.", icon: "server", }, { @@ -57,7 +57,7 @@ export const problemSignals: ProblemSignal[] = [ { title: "Performance ceiling", description: - ".NET 8 delivers 20-40% better throughput than .NET Framework on identical hardware. That's real money on cloud hosting bills.", + "Modern .NET delivers 20-40% better throughput than .NET Framework on identical hardware, according to Microsoft's TechEmpower benchmark results. That's real money on cloud hosting bills.", icon: "bolt", }, ]; @@ -87,14 +87,14 @@ export const migrationPaths: MigrationPath[] = [ }, { from: "ASP.NET Web Forms", - to: "Blazor or React", + to: "[Blazor or React](/services/frontend-development)", complexity: "High", timeline: "6-12 months", bestFor: "UI-heavy applications", }, { from: "WCF Services", - to: "gRPC or REST APIs", + to: "[gRPC or REST APIs](/services/backend-development)", complexity: "Medium-High", timeline: "4-8 months", bestFor: "Service-oriented architectures", @@ -120,13 +120,20 @@ export const migrationPaths: MigrationPath[] = [ timeline: "3-5 months", bestFor: "Background processing", }, + { + from: ".NET 8", + to: ".NET 10 (LTS)", + complexity: "Low", + timeline: "2-4 weeks", + bestFor: "Teams already on modern .NET needing LTS upgrade", + }, ]; export const migrationPathsIntro = "Every legacy .NET application is different. We assess your codebase, dependencies, and business constraints to recommend the right approach, not the most expensive one."; export const migrationPathsNote = - "Timeline estimates assume a mid-sized application (50K-200K lines of code) with typical dependencies. Your assessment will include specific estimates for your codebase."; + "Timeline estimates assume a mid-sized application (50K-200K lines of code) with typical dependencies. Your assessment will include specific estimates for your codebase. Most enterprise migrations target .NET 8 as the first modern .NET milestone. From there, upgrading to .NET 10 is a smaller, lower-risk step. We recommend this two-stage approach for teams still on .NET Framework."; // ============================================================================= // Approach Steps (for ProcessTimeline component) @@ -143,7 +150,7 @@ export const approachSteps: ApproachStep[] = [ number: 1, title: "Discovery & Assessment (2 weeks)", description: - "We analyze your codebase, map dependencies, and identify migration blockers. You get a detailed report covering risk assessment, recommended strategy, and realistic timeline.", + "Procedure's discovery phase runs 2 weeks and costs between $5,000 and $15,000, depending on codebase size. We analyze your codebase, map dependencies, and identify migration blockers using tools like Microsoft's .NET Upgrade Assistant alongside manual review. You get a detailed report covering risk assessment, recommended strategy, and realistic timeline - before you commit any further budget.", }, { number: 2, @@ -155,7 +162,7 @@ export const approachSteps: ApproachStep[] = [ number: 3, title: "Incremental Migration (varies)", description: - "We follow the Strangler Fig pattern, migrating module by module while keeping your application running. No big-bang deployments. No extended downtime. Zero disruption.", + "Procedure's engineering team follows the Strangler Fig pattern, migrating module by module while keeping your application running. No big-bang deployments. No extended downtime. Zero disruption.", }, { number: 4, @@ -167,7 +174,7 @@ export const approachSteps: ApproachStep[] = [ number: 5, title: "Knowledge Transfer & Handoff", description: - "Your team gets documentation, architecture decision records, and hands-on training. We build for self-sufficiency, not dependency. You own the modernized stack completely.", + "Your team gets documentation, architecture decision records, and hands-on training from Procedure's engineers in Mumbai and San Francisco. We build for self-sufficiency, not dependency. You own the modernized stack completely.", }, ]; @@ -213,8 +220,8 @@ export const technicalCapabilities: CapabilityGroup[] = [ items: [ "IIS-only \u2192 Kestrel with container support", "Windows Server \u2192 Linux containers (where appropriate)", - "On-premises \u2192 Azure App Services, AKS, or AWS ECS", - "Manual deployments \u2192 CI/CD with GitHub Actions or Azure DevOps", + "On-premises \u2192 [Azure App Services, AKS, or AWS ECS](/services/cloud)", + "Manual deployments \u2192 [CI/CD with GitHub Actions or Azure DevOps](/technologies/dotnet)", ], }, ]; @@ -233,25 +240,25 @@ export const riskScenarios: RiskScenario[] = [ { title: "\u201CThe migration broke production\u201D", description: - "We never do big-bang migrations. The Strangler Fig pattern lets us migrate incrementally while maintaining a working application. If something goes wrong, we roll back one module, not your entire system.", + "Procedure never does big-bang migrations. We use the Strangler Fig pattern to migrate module by module with zero planned downtime - your application stays live throughout the entire process. If something goes wrong, we roll back one module, not your entire system.", icon: "shield", }, { title: "\u201CIt took 3x longer than estimated\u201D", description: - "Our discovery phase identifies blockers before you commit budget. We've walked away from projects where the migration cost exceeded the business value. Honesty upfront saves everyone time.", + "Procedure's discovery phase identifies blockers before you commit budget. We've walked away from projects where the migration cost exceeded the business value. Honesty upfront saves everyone time.", icon: "chart", }, { title: "\u201COur team can't maintain the new code\u201D", description: - "We involve your developers from day one. Pair programming, code reviews, and documentation ensure knowledge transfer happens throughout the project, not as an afterthought.", + "Procedure involves your developers from day one. Pair programming, code reviews, and documentation ensure knowledge transfer happens throughout the project, not as an afterthought.", icon: "users", }, { title: "\u201CDependencies weren't compatible\u201D", description: - "We run automated compatibility analysis against your full dependency tree. Third-party libraries without .NET 8 support get flagged early, with alternatives recommended.", + "We run automated compatibility analysis using Microsoft's .NET Upgrade Assistant and API Portability Analyzer against your full dependency tree. Third-party libraries without modern .NET support get flagged early, with alternatives recommended.", icon: "puzzle", }, { @@ -278,7 +285,7 @@ export const faqs: FAQ[] = [ { question: "How much does .NET modernization cost?", answer: - "Migration costs depend on codebase size, complexity, and your target architecture. For reference: Simple migrations (.NET Core 3.1 \u2192 .NET 8): $15,000 - $40,000. Medium complexity (.NET Framework 4.8 \u2192 .NET 8): $50,000 - $150,000. Complex modernization (Web Forms/WCF \u2192 modern stack): $150,000 - $500,000+. Our discovery phase (typically $5,000 - $15,000) gives you accurate estimates before committing to full migration.", + ".NET modernization costs at Procedure range from $15,000 for simple version upgrades to $500,000+ for complex legacy rewrites, with most enterprise projects falling in the $50,000 to $150,000 range. Here's the breakdown: Simple migrations (.NET Core 3.1 \u2192 .NET 8/10): $15,000 - $40,000. Medium complexity (.NET Framework 4.8 \u2192 modern .NET): $50,000 - $150,000. Complex modernization (Web Forms/WCF \u2192 modern stack): $150,000 - $500,000+. Our discovery phase (2 weeks, $5,000 - $15,000) gives you accurate, codebase-specific estimates before committing to full migration.", }, { question: "How long does a .NET migration take?", @@ -300,11 +307,21 @@ export const faqs: FAQ[] = [ answer: "Yes. We use the Strangler Fig pattern to migrate module by module. Your application stays running throughout the migration. Each module is validated independently before traffic is switched.", }, + { + question: "Should we rewrite our .NET application or migrate incrementally?", + answer: + "In nearly every case, we recommend incremental migration over a full rewrite. Rewrites sound clean, but they're where .NET modernization projects go off the rails - scope creep, lost business logic, and timelines that double or triple. The Strangler Fig pattern lets you migrate one module at a time while keeping your application running in production. You get measurable progress every sprint, and you can pause or adjust priorities without losing work. The exception: if your application is under 20,000 lines of code and has good test coverage, a clean rewrite to modern .NET can sometimes be faster. Procedure's discovery phase will assess your specific situation and recommend the right approach with clear reasoning.", + }, { question: "What happens to our existing tests?", answer: "We migrate your test suites alongside your code. Unit tests are adapted to the new framework. Integration tests are updated to work with new hosting models. We also add regression tests to verify behavioral parity between old and new implementations.", }, + { + question: "Should we migrate to .NET 8, 9, or 10?", + answer: + "For most enterprise migrations from .NET Framework, we recommend targeting .NET 8 (LTS) as your first milestone. .NET 8 has long-term support through November 2026, a mature ecosystem, and the widest library compatibility. Once you're on .NET 8, upgrading to .NET 10 (LTS, released November 2025, supported through November 2028) is a much smaller step - typically 2-4 weeks for a mid-sized application. We don't recommend targeting .NET 9 for production workloads since it's a Standard Term Support release and will lose support before .NET 10. The exception: if your migration timeline extends past mid-2026, we may recommend going directly to .NET 10 to avoid an intermediate upgrade.", + }, ]; // ============================================================================= From 56183ae2ac4f7e3b6cc24f845b744de19635cac0 Mon Sep 17 00:00:00 2001 From: harshita375 Date: Wed, 25 Feb 2026 10:59:49 +0530 Subject: [PATCH 3/5] feat: React page copy refinements - AEO claims, entity mentions, internal links Update meta title/description, H2 headings, capability card copy with data-backed claims (React Compiler stats, Strangler Fig pattern). Add internal links to Next.js, Angular, Node.js, React Native, and Python pages. Add new FAQs for Vue.js comparison and evaluating React companies. Insert secondary CTA block between services grid and decision framework. Add renderLinkedText support to CapabilitiesGrid, ProcessTimeline, and RelatedExpertise components for markdown link rendering. Co-Authored-By: Claude Opus 4.6 --- app/services/[slug]/ExpertisePageClient.tsx | 31 ++++++- .../[slug]/slug-sections/CustomStackTable.tsx | 8 +- .../slug-sections/FrameworkComparison.tsx | 5 +- .../slug-sections/TechDecisionTable.tsx | 81 +++++++++---------- app/technologies/react/layout.tsx | 12 +-- components/expertise/CapabilitiesGrid.tsx | 3 +- components/expertise/ProcessTimeline.tsx | 3 +- components/expertise/RelatedExpertise.tsx | 3 +- content/services/frontend-development.mdx | 2 +- content/technologies/react.mdx | 30 ++++--- 10 files changed, 104 insertions(+), 74 deletions(-) diff --git a/app/services/[slug]/ExpertisePageClient.tsx b/app/services/[slug]/ExpertisePageClient.tsx index 6d592041..9de114f0 100644 --- a/app/services/[slug]/ExpertisePageClient.tsx +++ b/app/services/[slug]/ExpertisePageClient.tsx @@ -366,12 +366,39 @@ export default function ExpertisePageClient({
+ {/* React: Secondary CTA between services grid and decision framework */} + {expertise.slug === "react" && ( +
+
+ +

+ Ready to discuss your React project? +

+ + Schedule a Free Architecture Review + +

+ No sales pitch. Talk directly to our engineers. +

+
+
+
+ )} + {["frontend-development", "backend-development", "dotnet", "nextjs", "prometheus-monitoring", "istio-consulting", "thanos-long-term-storage"].includes(expertise.slug) && pageData.whoWeWorkWith && ( diff --git a/app/services/[slug]/slug-sections/CustomStackTable.tsx b/app/services/[slug]/slug-sections/CustomStackTable.tsx index 7c9bd846..6514795d 100644 --- a/app/services/[slug]/slug-sections/CustomStackTable.tsx +++ b/app/services/[slug]/slug-sections/CustomStackTable.tsx @@ -127,9 +127,9 @@ const dataMap: Record = { }, 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", @@ -196,7 +196,7 @@ const dataMap: Record = { }, ], 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", diff --git a/app/services/[slug]/slug-sections/FrameworkComparison.tsx b/app/services/[slug]/slug-sections/FrameworkComparison.tsx index a17437fa..464bf76e 100644 --- a/app/services/[slug]/slug-sections/FrameworkComparison.tsx +++ b/app/services/[slug]/slug-sections/FrameworkComparison.tsx @@ -48,8 +48,9 @@ const comparisonDataMap: Record = { ], 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{" "} + Next.js + , an authenticated dashboard on React + Vite, sharing the same component library and design system. We architect for this pattern regularly. ), diff --git a/app/services/[slug]/slug-sections/TechDecisionTable.tsx b/app/services/[slug]/slug-sections/TechDecisionTable.tsx index 9447b4b6..61f4b2b4 100644 --- a/app/services/[slug]/slug-sections/TechDecisionTable.tsx +++ b/app/services/[slug]/slug-sections/TechDecisionTable.tsx @@ -63,9 +63,9 @@ const dataMap: Record = { }, 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)", @@ -89,46 +89,41 @@ const dataMap: Record = { }, ], bottomNote: ( -

- If SEO and page speed are your top priority,{" "} - - Next.js - {" "} - gives you server-side rendering, static generation, and edge functions - built on React. For structured enterprise apps with strict conventions,{" "} - - Angular - {" "} - provides routing, forms, and dependency injection out of the box. Need a - lightweight backend to pair with React?{" "} - - Node.js - {" "} - or{" "} - - Python - {" "} - depending on your workload. Not sure? That's what our{" "} - - architecture consultation - {" "} - is for. -

+
+

+ Choosing the Right Approach for Your Project +

+
+

+ Some projects start as “we need a React app” but turn out to need something slightly different. Here's how we help teams land on the right approach: +

+

+ If your project needs strong SEO and server-side rendering, we typically recommend{" "} + Next.js + {" "}- which is built on React, so your team still writes React components. +

+

+ If you need a cross-platform mobile app alongside your web app,{" "} + React Native + {" "}lets you share code across both. +

+

+ If your enterprise already runs{" "} + Angular + {" "}and wants consistency across teams, extending that investment can make more sense than introducing a new framework. +

+

+ Need a lightweight backend to pair with React?{" "} + Node.js + {" "}or{" "} + Python + {" "}depending on your workload. +

+

+ We'll always recommend what fits your situation. That's what the free architecture review is for. +

+
+
), }, python: { diff --git a/app/technologies/react/layout.tsx b/app/technologies/react/layout.tsx index 10cfe8f2..3ec890fc 100644 --- a/app/technologies/react/layout.tsx +++ b/app/technologies/react/layout.tsx @@ -2,26 +2,26 @@ import type { Metadata } from "next"; export const metadata: Metadata = { title: - "React Development Services | Web Apps, SPAs & UI Engineering", + "React Development Services | Web Apps, SPAs & Dashboard Development", 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 | Web Apps, SPAs & UI Engineering", + "React Development Services | Web Apps, SPAs & Dashboard Development", 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", }, twitter: { card: "summary_large_image", title: - "React Development Services | Web Apps, SPAs & UI Engineering", + "React Development Services | Web Apps, SPAs & Dashboard Development", 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", }, diff --git a/components/expertise/CapabilitiesGrid.tsx b/components/expertise/CapabilitiesGrid.tsx index a56a63bb..f40c55b6 100644 --- a/components/expertise/CapabilitiesGrid.tsx +++ b/components/expertise/CapabilitiesGrid.tsx @@ -3,6 +3,7 @@ import { m } from "framer-motion"; import { ReactNode } from "react"; import { cn } from "@/lib/utils"; +import { renderLinkedText } from "@/lib/render-linked-text"; interface Capability { icon: ReactNode; @@ -92,7 +93,7 @@ export function CapabilitiesGrid({ {capability.title}

- {capability.description} + {renderLinkedText(capability.description)}

))} diff --git a/components/expertise/ProcessTimeline.tsx b/components/expertise/ProcessTimeline.tsx index 5936400e..cf498873 100644 --- a/components/expertise/ProcessTimeline.tsx +++ b/components/expertise/ProcessTimeline.tsx @@ -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; @@ -123,7 +124,7 @@ export function ProcessTimeline({

- {step.description} + {renderLinkedText(step.description)}

diff --git a/components/expertise/RelatedExpertise.tsx b/components/expertise/RelatedExpertise.tsx index f9fe06a2..4c1b1539 100644 --- a/components/expertise/RelatedExpertise.tsx +++ b/components/expertise/RelatedExpertise.tsx @@ -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; @@ -79,7 +80,7 @@ export function RelatedExpertise({

- {page.description} + {renderLinkedText(page.description)}

diff --git a/content/services/frontend-development.mdx b/content/services/frontend-development.mdx index 2008212f..1e9d55bf 100644 --- a/content/services/frontend-development.mdx +++ b/content/services/frontend-development.mdx @@ -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: diff --git a/content/technologies/react.mdx b/content/technologies/react.mdx index 3a704427..f33753f1 100644 --- a/content/technologies/react.mdx +++ b/content/technologies/react.mdx @@ -8,19 +8,19 @@ capabilities: description: "Single-page applications, multi-page React apps, and progressive web apps built with React 19 and TypeScript. We use Vite for fast builds, React Router for navigation, and Zustand or Redux Toolkit for state management. Not every React app needs Next.js. We'll tell you when it does and when it doesn't." icon: "globe" - title: "Dashboards & Data Visualization" - description: "Admin panels, analytics dashboards, and data-heavy interfaces with React, Recharts, D3, and AG Grid. Real-time updates via WebSockets, complex filtering, and role-based access. We've built dashboards handling 100K+ data points that stay responsive because the rendering strategy was right from the start." + description: "Admin panels, analytics dashboards, and data-heavy interfaces with React, Recharts, D3, and AG Grid. Real-time updates via WebSockets, complex filtering, and role-based access. We've built dashboards handling 100K+ data points with [Node.js](/technologies/nodejs/) backends that stay responsive because the rendering strategy was right from the start." icon: "chart" - title: "Component Libraries & Design Systems" - description: "Reusable component libraries built on Radix UI, shadcn/ui, or custom primitives. Storybook documentation, accessibility baked in, and tokens for consistent theming. Your design system becomes a shared language between designers and developers, not a Figma file nobody references." + description: "Reusable component libraries built on Radix UI, shadcn/ui, or custom primitives. Storybook documentation, accessibility baked in, and tokens for consistent theming. Your design system becomes a shared language between designers and developers, not a Figma file nobody references. Procedure has built and maintained design systems for product teams across fintech, SaaS, and enterprise applications." icon: "layers" - title: "React Native Cross-Platform" - description: "iOS and Android apps sharing 60-80% of code with your React web app. One team, one language, consistent UI. React Native with Expo for faster builds or bare workflow when you need native module access. We cover the overlap so you don't hire two separate mobile teams." + description: "React Native applications typically share 60-80% of their codebase with a React web app across iOS, Android, and web - including TypeScript types, business logic, API clients, and state management. React Native with Expo for faster builds or bare workflow when you need native module access. One team, one language - so you don't need two separate mobile teams. [Learn about our React Native development](/technologies/react-native/)." icon: "document" - title: "Performance Optimization" - description: "React Compiler adoption, bundle analysis, code splitting, lazy loading, and rendering strategy optimization. We've taken Lighthouse scores from 40 to 95+ on production apps. Specific, measurable improvements - not vague 'we optimize performance' promises." + description: "React Compiler adoption, bundle analysis, code splitting, lazy loading, and rendering strategy optimization. React Compiler v1.0, released October 2025, eliminates manual useMemo and useCallback - on production codebases, enabling it reduces unnecessary re-renders by 25-40%. Meta reports up to 12% faster initial loads and 2.5x faster interactions after compiler adoption. Procedure has taken Lighthouse scores from 40 to 95+ on production React apps. Specific, measurable improvements - not vague 'we optimize performance' promises." icon: "bolt" - title: "Legacy Frontend Migration" - description: "Moving from jQuery, AngularJS, Backbone, or aging React class components to modern React 19 with hooks and TypeScript. Incremental migration - your app stays live while we rebuild. Component by component, route by route. No big-bang rewrites." + description: "Migrating from jQuery, AngularJS, Backbone, or aging React class components to modern React with hooks and TypeScript. We follow the Strangler Fig pattern - incrementally replacing legacy components while the application stays live. Component by component, route by route. No big-bang rewrites. Class component to hooks migration within React typically completes in 4-8 weeks for mid-sized codebases." icon: "workflow" technologies: - React 19 @@ -44,7 +44,7 @@ relatedExpertise: process: - number: 1 title: "Architecture & Discovery (1-2 weeks)" - description: "We map your product requirements, user flows, and integration points. You get a technical proposal covering React vs Next.js decision, state management approach, component architecture, API integration strategy, hosting recommendation, and CI/CD setup. No code until the architecture makes sense." + description: "Procedure's engineering team maps your product requirements, user flows, and integration points. You get a technical proposal covering React vs [Next.js](/technologies/nextjs/) decision, state management approach, component architecture, API integration strategy, hosting recommendation, and CI/CD setup. No code until the architecture makes sense." - number: 2 title: "Design & Component System (1-2 weeks)" description: "Component library setup in Storybook, design tokens configured, and core UI patterns built. Your team can review and interact with components before a single page is assembled. Figma-to-code pipeline so designers and developers work from the same source." @@ -56,7 +56,7 @@ process: description: "Lighthouse audits, Core Web Vitals optimization, cross-browser testing, accessibility audit (WCAG 2.1 AA), and load testing. React Compiler enabled and verified. Nothing launches until performance meets agreed benchmarks." - number: 5 title: "Handoff & Support" - description: "Complete documentation, component library with Storybook, architecture decision records, and deployment runbooks. Your team owns the codebase. Optional support retainer for ongoing work, but no lock-in." + description: "Complete documentation, component library with Storybook, architecture decision records, and deployment runbooks from Procedure's engineers in Mumbai. Your team owns the codebase fully. Optional support retainer for ongoing work, but no lock-in." engagementModels: title: "Hire React Developers" subtitle: "Experienced React engineers who plug into your team and ship from week one." @@ -74,19 +74,23 @@ faqs: - question: "How much does React development cost?" answer: "It depends on scope. A dashboard or internal tool with 10-15 screens typically runs $20,000 to $50,000. A SaaS application frontend with auth, real-time features, and integrations sits in the $50,000 to $150,000 range. Enterprise platforms with design systems, component libraries, and multi-team architecture can run $150,000 to $400,000+. Our architecture consultation is free and scopes your specific project." - question: "React vs Angular - which should I choose?" - answer: "React gives you flexibility and a massive ecosystem. You pick your routing, state management, and build tools. Angular gives you structure - routing, forms, HTTP, and dependency injection are built in. For interaction-heavy UIs, dashboards, and teams that want to choose their own tools, React is the better fit. For large enterprise apps with strict conventions and multiple teams, Angular's opinionated architecture keeps code consistent. We build with both and recommend based on your situation." + answer: "React gives you flexibility and a massive ecosystem. You pick your routing, state management, and build tools. [Angular](/technologies/angular/) gives you structure - routing, forms, HTTP, and dependency injection are built in. For interaction-heavy UIs, dashboards, and teams that want to choose their own tools, React is the better fit. For large enterprise apps with strict conventions and multiple teams, Angular's opinionated architecture keeps code consistent. We build with both and recommend based on your situation." + - question: "How does React compare to Vue.js?" + answer: "React and Vue.js are both strong choices for building modern frontends - the right pick depends on your team and project context. React has the larger ecosystem, more third-party libraries, and a deeper talent pool, which makes it easier to scale teams and find community solutions. Vue has a gentler learning curve and ships with more built-in opinions on routing and state management, which can speed up initial development. For enterprise applications, cross-platform needs with React Native, and teams that want maximum flexibility in architectural decisions, React is typically the better fit. Both frameworks are production-ready and well-maintained. Procedure currently builds with React and recommends it for most commercial projects, though we evaluate technology choices on a per-project basis." - question: "Should I use React or Next.js?" - answer: "If your app needs SEO, server-side rendering, or static generation, use Next.js - it's React with a framework around it. If you're building an internal tool, dashboard, or authenticated SPA where SEO doesn't matter, plain React with Vite is simpler, faster to develop, and cheaper to host. Many projects use both: Next.js for the public site, React + Vite for the authenticated app. We help you decide based on what the product actually needs." + answer: "Not every React application needs [Next.js](/technologies/nextjs/). Applications that don't require SEO, server-side rendering, or static generation - such as internal dashboards, admin panels, and authenticated SPAs - are faster to build and cheaper to host with React and Vite. If your app does need SEO or server rendering, Next.js handles that natively - it's React with a framework around it. Many projects use both: Next.js for the public site, React + Vite for the authenticated app. We help you decide based on what the product actually needs." - question: "Can you build mobile apps with React?" - answer: "Yes. React Native uses the same component model and mental model as React for web. Your team shares TypeScript types, business logic, and sometimes entire components between web and mobile. We've built cross-platform apps sharing 60-80% of code across iOS, Android, and web." + answer: "Yes. React Native uses the same component model and mental model as React for web. Your team shares TypeScript types, business logic, and sometimes entire components between web and mobile. We've built cross-platform apps sharing 60-80% of code across iOS, Android, and web. For mobile-specific work, we also offer [dedicated React Native development](/technologies/react-native/)." - question: "What about React performance in 2026?" answer: "React 19 with the React Compiler (v1.0, shipped Oct 2025) handles memoization automatically. No more manual useMemo and useCallback. Activity API lets you pre-render hidden parts of the app for instant navigation. Server Components (via Next.js) reduce client-side JavaScript by 30-50% for applicable pages. We enable the Compiler on every new project and have seen 25-40% fewer re-renders on existing codebases after adoption." - question: "How long does it take to build a React application?" - answer: "A dashboard or internal tool: 8-12 weeks. A SaaS frontend with auth, integrations, and real-time features: 12-20 weeks. An enterprise platform with design system and component library: 16-28 weeks. These assume a team of 2-4 developers and include architecture, development, testing, and deployment." + answer: "A typical React dashboard takes 8-12 weeks. SaaS frontends run 12-20 weeks. Enterprise platforms with design systems take 16-28 weeks. These assume a team of 2-4 developers and include architecture, development, testing, and deployment. Timelines include Procedure's full delivery process: architecture review, sprint-based development with preview deployments, QA, performance optimization, and handoff." - question: "Do you work with US-based teams from India?" answer: "Yes. Our engineering team is based in India (Mumbai) with working hours that overlap US EST and PST. We've delivered React projects for US clients across fintech, healthcare, and enterprise SaaS. Communication happens over Slack, daily standups, and weekly demos." - question: "What React version do you use?" answer: "React 19 (currently 19.2) for all new projects. We use TypeScript in strict mode across every codebase. For existing applications, we help teams upgrade from older React versions - including class component to hooks migration, React Router upgrades, and React Compiler adoption." + - question: "How do I evaluate a React development company?" + answer: "Look for five things. First, check if they use current React - React 19, TypeScript in strict mode, React Compiler enabled. Teams still on class components or JavaScript-only codebases are behind. Second, ask about build tooling - Vite or Next.js, CI/CD pipelines, preview deployments on every PR. Third, ask to see a Storybook or component library from a past project - it shows how they think about reusable architecture. Fourth, check if they understand when NOT to use React. A team that recommends the same stack for every project doesn't understand the ecosystem. Fifth, talk to their engineers directly, not just project managers or account executives. At Procedure, your first call is with the developers who will write your code." cta: title: "Ready to Discuss Your React Project?" description: "Talk directly with engineers, not sales. We will assess fit and give honest next steps." @@ -94,6 +98,6 @@ cta: buttonLink: "/contact-us" supportingNote: "No obligation. No pressure. Clear technical direction." seo: - title: "React Development Services | Web Apps, SPAs & UI Engineering" - description: "React development services for web applications, SPAs, dashboards, and component libraries. React 19, TypeScript, production-tested. Talk to engineers, not sales." + title: "React Development Services | Web Apps, SPAs & Dashboard Development" + description: "React development services for web apps, SPAs, and enterprise dashboards. React 19, TypeScript, free architecture review. Talk to engineers, not sales." --- From d349dfb211cdebe38f60507a063018d2109e926d Mon Sep 17 00:00:00 2001 From: harshita375 Date: Wed, 25 Feb 2026 11:26:50 +0530 Subject: [PATCH 4/5] fix: handle undefined/null input in renderLinkedText Add null guard to prevent crash when description fields (e.g. tagline) are undefined in related expertise pages. Co-Authored-By: Claude Opus 4.6 --- lib/render-linked-text.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/render-linked-text.tsx b/lib/render-linked-text.tsx index 97c35265..6fe0ec5f 100644 --- a/lib/render-linked-text.tsx +++ b/lib/render-linked-text.tsx @@ -5,7 +5,8 @@ import { ReactNode } from "react"; * Parses markdown-style links [text](url) in a string and returns * React nodes with Next.js Link components for internal links. */ -export function renderLinkedText(text: string): ReactNode { +export function renderLinkedText(text: string | undefined | null): ReactNode { + if (!text) return text ?? null; const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g; const parts: ReactNode[] = []; let lastIndex = 0; From 3eca02ca8abbd7f07563d0e7dc7ffe5ec64b22a9 Mon Sep 17 00:00:00 2001 From: harshita375 Date: Wed, 25 Feb 2026 12:25:30 +0530 Subject: [PATCH 5/5] feat: Add Go (Golang) technology page with AEO-optimized content New technology page at /technologies/go targeting "Go development services" and "Golang development company" keywords. Competitor research against Radixweb, MindInventory, Evrone, BairesDev, and Golang.company informed content depth and differentiation strategy. - 6 capabilities (APIs, microservices, cloud-native, concurrency, CLI, migration) - 10 AEO-optimized FAQs with self-contained answers and specific numbers - 18-item tech stack (Go 1.23, Gin, Echo, Fiber, gRPC, K8s, Terraform...) - 3 engagement models (dedicated dev, backend pod, project-based) - 5-step delivery process with realistic timelines - Internal links to backend-development, cloud, kubernetes, nodejs, python - JSON-LD structured data (Service + FAQPage + BreadcrumbList) - Hero config, booking text, mid-page CTA, pricing section - Technologies hub updated with Go page link Co-Authored-By: Claude Opus 4.6 --- app/services/[slug]/ExpertisePageClient.tsx | 44 +++++--- app/services/[slug]/ExpertisePageHero.tsx | 10 +- app/technologies/go/layout.tsx | 36 +++++++ app/technologies/go/page.tsx | 28 +++++ content/technologies/go.mdx | 107 ++++++++++++++++++++ lib/technologies-hub-data.ts | 2 +- 6 files changed, 212 insertions(+), 15 deletions(-) create mode 100644 app/technologies/go/layout.tsx create mode 100644 app/technologies/go/page.tsx create mode 100644 content/technologies/go.mdx diff --git a/app/services/[slug]/ExpertisePageClient.tsx b/app/services/[slug]/ExpertisePageClient.tsx index 9de114f0..76384032 100644 --- a/app/services/[slug]/ExpertisePageClient.tsx +++ b/app/services/[slug]/ExpertisePageClient.tsx @@ -79,6 +79,8 @@ const bookingSubtext: Record = { "Tell us about your Angular project. Whether it\u2019s a new build, AngularJS migration, or performance optimization, we\u2019ll discuss architecture and give honest next steps.", "flutter": "Tell us about your Flutter project. Whether it\u2019s a new app, migration from native, or multi-platform expansion, we\u2019ll discuss architecture and give honest next steps.", + "go": + "Tell us about your Go backend requirements. Whether it\u2019s APIs, microservices, or a cloud-native migration, we\u2019ll discuss architecture and give honest next steps.", "react-native": "Tell us about your React Native project. Whether it\u2019s a new app, migration from native, or adding mobile to your React web app, we\u2019ll discuss architecture and give honest next steps.", "prometheus-monitoring": @@ -99,6 +101,7 @@ const technologyLogos: Record = { dotnet: "/technologies/dotnet-logo.svg", flutter: "/technologies/flutter-logo.svg", "react-native": "/technologies/react-logo.svg", + go: "/technologies/golang-logo.svg", }; // "What you get" content per technology - used in the hire section @@ -151,6 +154,15 @@ const whatYouGetContent: Record )} -
+
@@ -446,10 +462,10 @@ export default function ExpertisePageClient({ )} {pageData.process && ( -
+
@@ -540,8 +556,8 @@ export default function ExpertisePageClient({ )} {/* Mid-page CTA for dotnet/nextjs/nodejs/react/python/angular/flutter/react-native/prometheus-monitoring/istio-consulting - before Architecture section */} - {["dotnet", "nextjs", "nodejs", "react", "python", "angular", "flutter", "react-native", "prometheus-monitoring", "istio-consulting", "thanos-long-term-storage"].includes(expertise.slug) && ( -
+ {["dotnet", "nextjs", "nodejs", "react", "go", "python", "angular", "flutter", "react-native", "prometheus-monitoring", "istio-consulting", "thanos-long-term-storage"].includes(expertise.slug) && ( +
Prometheus Metrics Growing Faster Than Your Retention Budget? : expertise.slug === "istio-consulting" ? <>Not Sure If You Need a Service Mesh? - : <>Discuss Your {expertise.slug === "nextjs" ? "Next.js" : expertise.slug === "nodejs" ? "Node.js" : expertise.slug === "react" ? "React" : expertise.slug === "python" ? "Python" : expertise.slug === "angular" ? "Angular" : ".NET"} Project + : <>Discuss Your {expertise.slug === "nextjs" ? "Next.js" : expertise.slug === "nodejs" ? "Node.js" : expertise.slug === "react" ? "React" : expertise.slug === "go" ? "Go" : expertise.slug === "python" ? "Python" : expertise.slug === "angular" ? "Angular" : ".NET"} Project }

@@ -566,6 +582,8 @@ export default function ExpertisePageClient({ ? "Whether it\u2019s a new build, migration, or performance optimization, we\u2019re happy to talk through your situation." : expertise.slug === "nodejs" ? "Whether it\u2019s APIs, microservices, or a full backend migration, we\u2019re happy to talk through your situation." + : expertise.slug === "go" + ? "Whether it\u2019s APIs, microservices, or a cloud-native migration, we\u2019re happy to talk through your situation." : expertise.slug === "react" ? "Whether it\u2019s a new build, migration, or performance optimization, we\u2019re happy to talk through your situation." : expertise.slug === "python" @@ -614,7 +632,7 @@ export default function ExpertisePageClient({ )} {pageData.engagementModels && ( -

+
{/* "What you get" block with technology logo - before EngagementModels */} {whatYouGetContent[expertise.slug] && (
@@ -694,7 +712,7 @@ export default function ExpertisePageClient({ /> {/* Node.js / React / Python / Angular / Flutter: Pricing line + CTA after EngagementModels */} - {["nodejs", "react", "python", "angular", "flutter", "react-native"].includes(expertise.slug) && ( + {["nodejs", "react", "go", "python", "angular", "flutter", "react-native"].includes(expertise.slug) && (
{pageData.faqs.length > 0 && ( -
+
diff --git a/app/services/[slug]/ExpertisePageHero.tsx b/app/services/[slug]/ExpertisePageHero.tsx index e0bee0c1..6a289fd9 100644 --- a/app/services/[slug]/ExpertisePageHero.tsx +++ b/app/services/[slug]/ExpertisePageHero.tsx @@ -8,6 +8,7 @@ const heroCTAMap: Record = { "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" }, @@ -19,7 +20,7 @@ const heroCTAMap: Record = { 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", ]; @@ -90,6 +91,13 @@ const heroChildrenMap: Record = { { 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: [ diff --git a/app/technologies/go/layout.tsx b/app/technologies/go/layout.tsx new file mode 100644 index 00000000..bc5a1ad3 --- /dev/null +++ b/app/technologies/go/layout.tsx @@ -0,0 +1,36 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: + "Go Development Services | High-Performance APIs & Microservices", + description: + "Go development services for scalable APIs, microservices, and cloud-native backends. Senior Go engineers, free architecture review. Talk to engineers, not sales.", + alternates: { + canonical: "/technologies/go", + }, + openGraph: { + title: + "Go Development Services | High-Performance APIs & Microservices", + description: + "Go development services for scalable APIs, microservices, and cloud-native backends. Senior Go engineers, free architecture review. Talk to engineers, not sales.", + type: "website", + url: "/technologies/go", + }, + twitter: { + card: "summary_large_image", + title: + "Go Development Services | High-Performance APIs & Microservices", + description: + "Go development services for scalable APIs, microservices, and cloud-native backends. Senior Go engineers, free architecture review. Talk to engineers, not sales.", + site: "@procedurehq", + creator: "@procedurehq", + }, +}; + +export default function GoLayout({ + children, +}: { + children: React.ReactNode; +}) { + return <>{children}; +} diff --git a/app/technologies/go/page.tsx b/app/technologies/go/page.tsx new file mode 100644 index 00000000..3f5977d9 --- /dev/null +++ b/app/technologies/go/page.tsx @@ -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 ( + } + /> + ); +} diff --git a/content/technologies/go.mdx b/content/technologies/go.mdx new file mode 100644 index 00000000..09a42d55 --- /dev/null +++ b/content/technologies/go.mdx @@ -0,0 +1,107 @@ +--- +title: "Go Development Services" +headline: "Go Development Services" +headlineAccent: "High-Performance APIs & Cloud-Native Systems" +description: "Scalable APIs, microservices, and cloud-native backends built by engineers who ship production Go systems. Architecture review included." +capabilities: + - title: "High-Performance APIs" + description: "REST and gRPC APIs built for throughput. Go's goroutines handle thousands of concurrent requests with minimal memory overhead — where a Node.js API might need 512MB, an equivalent Go service runs in 50MB. Protocol Buffers for efficient serialization, OpenAPI specs for documentation, and comprehensive middleware for auth, rate limiting, and observability. We build APIs that serve 10,000+ requests per second on a single instance." + icon: "bolt" + - title: "Microservices Architecture" + description: "Service-oriented backends with clear domain boundaries, gRPC for inter-service communication, and distributed tracing with OpenTelemetry. Each service compiles to a single binary — no runtime dependencies, no dependency conflicts, no 'works on my machine' problems. We design service boundaries aligned to business domains so teams can deploy independently. Pairs naturally with [Kubernetes](/services/kubernetes) for orchestration." + icon: "workflow" + - title: "Cloud-Native Systems" + description: "Go was built for the cloud. Docker, Kubernetes, Terraform, Prometheus — the core cloud infrastructure tools are written in Go. We build systems that leverage this native ecosystem: containerized services with minimal images (often under 20MB), Kubernetes operators for custom automation, and serverless functions on AWS Lambda or Google Cloud Run. Infrastructure that scales automatically and costs nothing when idle." + icon: "globe" + - title: "Real-Time & Concurrent Systems" + description: "WebSocket servers, event-driven architectures, and stream processing pipelines. Go's concurrency model — goroutines and channels — handles thousands of simultaneous connections without the complexity of thread pools or callback hell. Live dashboards, chat systems, notification services, and IoT data ingestion. When your system needs to handle many things at once, Go's concurrency primitives make the code straightforward to write and reason about." + icon: "zap" + - title: "CLI Tools & Developer Infrastructure" + description: "Go compiles to a single static binary that runs on any platform — no runtime, no dependencies, no installation friction. We build command-line tools, internal developer platforms, and infrastructure automation. kubectl, Docker, Terraform, and GitHub CLI are all written in Go for this reason. If your engineering team needs internal tooling that just works, Go is the right choice." + icon: "code" + - title: "Backend Modernization & Migration" + description: "Migrating from [Python](/technologies/python/) or [Node.js](/technologies/nodejs/) monoliths to Go microservices. We follow the Strangler Fig pattern — incrementally replacing services while production stays live. Typical migration path: identify bottleneck services, rewrite in Go, route traffic gradually. Teams see 5-10x throughput improvement and 60-80% reduction in infrastructure costs on migrated services." + icon: "document" +technologies: + - Go 1.23 + - Gin + - Echo + - Fiber + - gRPC + - Protocol Buffers + - PostgreSQL + - Redis + - MongoDB + - Docker + - Kubernetes + - Terraform + - AWS + - Google Cloud + - Prometheus + - OpenTelemetry + - GitHub Actions + - NATS +relatedExpertise: + - backend-development + - cloud + - kubernetes +process: + - number: 1 + title: "Architecture & Discovery (1-2 weeks)" + description: "Map system requirements, concurrency patterns, and data flow. You get a technical proposal covering API design (REST vs gRPC), service boundaries, database strategy, deployment architecture, and infrastructure approach. We decide on Go frameworks (Gin, Echo, or standard library) based on your project's specific needs — not habit." + - number: 2 + title: "API Design & Contracts (1-2 weeks)" + description: "API specifications in OpenAPI or Protocol Buffers, database schemas designed, service communication patterns defined. Your frontend team can start building against mocked endpoints immediately. Contract-first development means fewer integration surprises later." + - number: 3 + title: "Development & Iteration (6-16 weeks)" + description: "Sprint-based delivery with preview deployments. Your team sees working services continuously, not at the end of a sprint. Automated tests and benchmarks written alongside code. Go's fast compilation means CI pipelines complete in minutes, not hours." + - number: 4 + title: "Load Testing & Optimization (1-2 weeks)" + description: "Go's built-in profiler (pprof) identifies CPU hotspots, memory allocations, and goroutine leaks. Load testing under production-realistic conditions with k6 or Locust. We optimize until performance targets are met — specific latency percentiles, throughput numbers, and resource limits. Nothing ships until benchmarks pass." + - number: 5 + title: "Deployment & Handoff" + description: "Dockerized services, Kubernetes manifests or Terraform configs, CI/CD pipelines, Prometheus dashboards, and alerting rules. Complete documentation including architecture decision records and runbooks. Your team owns everything. Optional support retainer for ongoing optimization, but no lock-in." +engagementModels: + title: "Hire Go Developers" + subtitle: "Engineers who ship production Go systems, not bootcamp graduates learning on your project." + models: + - title: "Dedicated Developer" + description: "Backend engineer specializing in Go. API design, database optimization, cloud infrastructure. Full technical ownership of assigned services." + bestFor: "Ongoing backend development, 3-month minimum engagement" + - title: "Backend Pod (2-4 Engineers)" + description: "Self-contained team owning full service delivery. Architecture, development, testing, deployment. Mixed seniority based on project complexity." + bestFor: "Multi-service platform, microservices migration, 6-month minimum" + - title: "Project-Based Delivery" + description: "Fixed-scope engagement with clear deliverables, timeline, and budget. Defined API specs, agreed milestones, transparent pricing." + bestFor: "Well-scoped projects with clear endpoints" +faqs: + - question: "When should we use Go instead of Node.js or Python?" + answer: "Go is the better choice when performance, concurrency, or resource efficiency matters. Go APIs typically handle 10-50x more requests per second than equivalent Node.js or Python services, using 1/5 to 1/10 the memory. Choose Go for high-throughput APIs, microservices architectures, real-time systems, and infrastructure tooling. Choose [Node.js](/technologies/nodejs/) when your team already knows JavaScript and the workload is I/O-bound with moderate throughput. Choose [Python](/technologies/python/) when you need AI/ML libraries or rapid prototyping. For straightforward CRUD applications with moderate traffic, all three work — Go's advantages become clear at scale." + - question: "How does Go handle concurrency?" + answer: "Go uses goroutines — lightweight threads managed by the Go runtime, not the operating system. A single Go process can run millions of goroutines simultaneously, each using only ~2KB of memory initially (compared to ~1MB per OS thread). Goroutines communicate through channels, which prevent the shared-memory bugs common in traditional multi-threaded programming. This makes Go's concurrency model both more efficient and safer than thread-based approaches in Java or C++. It's why Go is the language of choice for systems like Kubernetes, Docker, and cloud infrastructure tools." + - question: "Go vs Rust — when should we choose which?" + answer: "Go prioritizes developer productivity and fast compilation. Rust prioritizes memory safety with zero-cost abstractions and no garbage collector. Choose Go for web services, APIs, microservices, and cloud infrastructure — where development speed and operational simplicity matter most. Choose Rust for systems programming, embedded systems, WebAssembly, or anywhere garbage collection pauses are unacceptable (sub-microsecond latency requirements). Go's garbage collector is fast (sub-millisecond pauses in most cases), but Rust eliminates GC entirely. Most backend web services should choose Go; most systems-level or performance-critical libraries should consider Rust." + - question: "How much does Go development cost?" + answer: "A typical Go REST API with auth, database, and deployment takes 8-12 weeks and costs $25,000 to $60,000. A microservices platform with 4-8 services runs $60,000 to $200,000 over 12-20 weeks. Infrastructure tooling and CLI tools are typically $15,000 to $40,000. Costs depend on complexity, number of integrations, and team size. Our architecture consultation is free and scopes your specific project with transparent pricing." + - question: "Is Go good for microservices?" + answer: "Go is one of the best languages for microservices. Fast compilation produces small, static binaries (often 10-20MB) that start in milliseconds — essential for container orchestration and auto-scaling. gRPC support is first-class. The standard library includes everything needed for HTTP servers, JSON handling, and database connectivity without heavy frameworks. Docker, Kubernetes, Istio, and most cloud-native tools are written in Go. Procedure's [backend development](/services/backend-development) and [Kubernetes](/services/kubernetes) teams work directly with Go microservices architectures." + - question: "Can you migrate our existing backend to Go?" + answer: "Yes. We follow the Strangler Fig pattern for backend migrations — replacing services incrementally while production stays live. Typical migration path: identify the highest-impact services (usually the ones with performance bottlenecks or highest infrastructure costs), rewrite those in Go, route traffic gradually using a load balancer or API gateway. A mid-sized migration (3-5 services) typically completes in 12-20 weeks. Teams reduce infrastructure costs by 60-80% and improve response times by 5-10x on migrated services." + - question: "What Go frameworks do you use?" + answer: "We evaluate per project. Gin for REST APIs that need middleware, routing, and JSON validation — it's the most popular Go web framework with a mature ecosystem. Echo for similar use cases with slightly better performance characteristics. Fiber for high-throughput APIs where raw speed matters. Standard library (net/http) for simple services or when you want zero external dependencies. gRPC with Protocol Buffers for inter-service communication. The right choice depends on your API style, team preference, and performance requirements. We recommend during the architecture phase." + - question: "How long does it take to build a Go backend?" + answer: "A REST API with auth, database, and basic CRUD takes 6-10 weeks. A microservices platform with service discovery, gRPC, and distributed tracing takes 12-20 weeks. A complete backend system with auth, caching, message queues, monitoring, and deployment pipeline takes 10-16 weeks. Timelines include Procedure's full delivery process: architecture review, API design, sprint-based development, load testing, and deployment setup." + - question: "Do you work with US-based teams from India?" + answer: "Yes. Our engineering team is based in Mumbai, India with working hours that overlap US EST and PST. We've delivered backend systems for clients across fintech, SaaS, and enterprise platforms. Communication happens over Slack, daily standups, and weekly demos. Starting at $3,500/month per developer for full-time dedicated engagement." + - question: "Why is Go popular for cloud-native development?" + answer: "Go was designed at Google specifically for building large-scale distributed systems. The language compiles to static binaries with no external dependencies, starts in milliseconds, and has a tiny memory footprint — all critical for containerized, auto-scaling environments. The cloud-native ecosystem is written in Go: Kubernetes, Docker, Terraform, Prometheus, Istio, etcd, and NATS. Building in Go means your application code and your infrastructure tools share the same language, the same debugging tools, and the same mental model. This alignment is why 75% of CNCF projects are written in Go." +cta: + title: "Ready to Discuss Your Go Project?" + description: "Talk directly with engineers, not sales. We'll assess fit and give honest next steps." + buttonText: "Talk to a Go Engineer" + buttonLink: "/contact-us" + supportingNote: "No obligation. No pressure. Clear technical direction." +seo: + title: "Go Development Services | High-Performance APIs & Microservices" + description: "Go development services for scalable APIs, microservices, and cloud-native backends. Senior Go engineers, free architecture review. Talk to engineers, not sales." +--- diff --git a/lib/technologies-hub-data.ts b/lib/technologies-hub-data.ts index d25218a7..f33b7a32 100644 --- a/lib/technologies-hub-data.ts +++ b/lib/technologies-hub-data.ts @@ -173,7 +173,7 @@ export const technologies: TechnologyItem[] = [ category: "backend", description: "High-performance compiled language for cloud-native services", logoPath: "/technologies/golang-logo.svg", - href: null, + href: "/technologies/go", }, { name: "Rust",