gemcorpcapital.com
From Rostrum, prepared for Actum Digital.
May 2026.
This pack covers every dev-side change Rostrum is recommending for gemcorpcapital.com following a fresh full audit of the live site (151 pages). Most of it is copy-paste ready. Code snippets are in the attached snippets/ folder; same files mirrored at github.com/amosWeiskopf/gemcorp-code-snippets. Schema test pages: https://gist.github.com/amosWeiskopf/cdeaef5065d5d8277e4da939c485afe2 (all 13 blocks pass Google’s Rich Results Test and the schema.org validator). All C# is verified against .NET 8 (zero warnings, zero errors).

Worth noting before the list: the cannibalization between the capabilities page and the investment philosophy page has been resolved since our last audit, so it’s not on the list below.
Worth knowing what’s already correct (so you can park these): canonical tags are properly set across all 151 pages with absolute URLs, hreflang is fine, mobile is at 100%, HSTS and X-Content-Type-Options are at 100% sitewide coverage. None of that needs touching.
Quick wins
1. Open Graph and Twitter Card meta tags
Currently absent site-wide. One template change covers every page; see snippets/og-twitter-tags.cshtml. You’ll also need a default OG image: 1200x630px, JPG or PNG (not SVG), Gemcorp logo on brand background, save to /assets/dist/images/og/default.jpg. Biggest single uplift, and AI assistant preview cards start working.
2. Sitemap rebuild
All 151 crawlable pages are missing from /sitemap.xml. The four legacy sitemaps under /en/, /ics-en/, /ics-pt/, /ka-pt/ use URL patterns that no longer match the live site. Create one /sitemap.xml covering all indexable URLs with proper <lastmod> dates (reflecting actual content changes, not generation time), update robots.txt to point at it, and remove or 301 the old four. See snippets/robots-and-sitemap.txt.
3. Security headers
Content-Security-Policy is missing on every page (0 of 151). X-Frame-Options is rolled out inconsistently: present on the homepage, absent on most pages. See snippets/csp-and-headers.cs.
Roll out CSP as Content-Security-Policy-Report-Only first to catch breakages without going live, then switch to Content-Security-Policy once the report is clean. The starter CSP includes ‘unsafe-inline’ and ‘unsafe-eval’ on script-src to avoid breaking GTM and inline analytics; the upgrade path is per-request nonces once you’ve audited inline scripts. HSTS and X-Content-Type-Options are already at 100% coverage, so leave those alone.
4. Title tags and meta descriptions
Per-page values for every existing page plus the four new pages we’re proposing. See snippets/titles-and-descriptions.tsv. No template change required.
5. Schema markup
13 JSON-LD blocks ready to deploy: Organization (homepage), Person (CEO and team-member template), Article (insight/news template), BreadcrumbList (homepage / 2nd level / 3rd-level-and-deeper), FAQPage (homepage excerpt and full /faq), VideoObject (Gemcast embeds), Organization (governance variant), Project (Cabinda).
Each block goes in <head>, wrapped in <script type="application/ld+json">. Multiple blocks can coexist on one page. Files at the gist link above. The FAQPage schemas have one ownership question pending Gemcorp legal sign-off; deploy 4 (homepage excerpt of 5) and 9 (full /faq of 10) of the questions first, add the ownership question once signed off.
6. Two 301 redirects
The regulatory-disclousure typo needs to redirect to regulatory-disclosure. The CEO page should consolidate from /about-us/investment-team/atanas-bostandjiev to /atanas-bostandjiev. Both must be 301 (permanent), not 302; 301 transfers ranking signals. See snippets/redirects.cs.
Housekeeping
7. Cache-Control
Currently sending no-cache, no-store on everything including static assets, which forces re-download on every page load. See snippets/cache-control.cs. Long max-age with immutable for fonts and fingerprinted CSS/JS; shorter for images and PDFs; 5-minute cache for HTML. If CSS/JS aren’t fingerprinted, drop immutable and use 7 days.
8. Font externalisation
CSS embeds fonts as base64 data URIs, inflating page weight by roughly 300 to 350KB and making fonts uncacheable. Extract from @font-face declarations, decode to .woff2 in /assets/dist/fonts/, replace data URIs with file paths, add font-display: swap. See snippets/font-face.css. Expected page weight drop: 536KB to roughly 180-200KB.
9. LCP performance
Real-user data from Chrome UX Report (p75): LCP 2,581ms, FCP 2,350ms. Both register as needs_improvement against Google’s 2,500ms threshold for LCP. The font externalisation above is the biggest single lever. CDN options (Azure CDN or Front Door) help further.
10. Article dates
22 article pages are missing published and modified dates. AI systems and Google prioritise fresh content; both fields should be set per-page and reflected in the Article schema (template at the gist).
11. Orphan pages and duplicate URLs
18 pages have zero internal links pointing to them. Full list with suggested source pages and anchor text in snippets/orphan-pages-link-targets.tsv. Three things worth flagging from that analysis:
/contact appears in the orphan list. Almost certainly a false positive (it’s in your footer), but worth checking the footer markup uses the exact /contact URL the crawler can see, not a variant like /contacts or a JavaScript-routed link.
Most of the orphans are senior people: Chairman Lord Grimstone; executive leadership (Yuri Baidoukov, Philippe Balland, Chris Bell, Tom Hughes); regional and affiliate heads (Walter Pacheco, Gaj Wallooppillai); senior advisers (Lord Lister, Bing Ji, Antonio Poncioni Merian). They need a "Leadership" listing on /about-us and on the new /governance page. Drop-in Razor partial in snippets/board-listing-partial.cshtml, with board-listing-model.cs (view model plus seed data, all 10 roles verified against the live bio pages on 2026-05-07), board-listing-styles.css (minimal BEM-class styling, theme to match), and board-listing-rendered.html (reference output for review).
Two pages exist at two URLs each: /understanding-em-private-credit also lives at /insight/understanding-em-private-credit, and /sub-saharan-africa-the-resurgence also lives at /insight/sub-saharan-africa-the-resurgence. Pick one canonical for each and 301 the other. Until that’s resolved, both versions are competing for the same ranking.
12. Cannibalization, second pass
The four gated capability pages (us-gcap, non-us-gcap, gemcorp-structured-capital-solutions-fund-i and -ii, gemcorp-ksa-inward-investment) are 87% similar to each other; Google can’t tell them apart. Each needs differentiated content describing its specific fund mandate, not shared boilerplate. Likewise the Gemcast episode pages share too much podcast template; each episode needs unique descriptive content beyond the boilerplate.
Architecture: gated fund pages
The site is on Kentico Xperience with React SSR. SSR is working correctly for the vast majority of pages: canonical, meta, content, navigation all present in the raw server HTML. Confirmed across 151 pages. The exception is the 5 pages under /capabilities/ requiring investor qualification. Their server HTML shows "Restricted Content, Qualification Required" as the H1 with very thin content (39 to 63 words) behind the JS gate. Google is indexing the gate, not the fund content.
Three options
a. SSR the full content with the JS gate over it. Render the fund content in the server HTML (so Google indexes it), overlay the qualification gate via JavaScript for end users. Industry-standard for gated financial content.
b. Separate public summary pages. Ungated summaries with enough content to rank, linking to the gated full versions for qualified investors. Cleanest from a compliance angle.
c. Dynamic rendering. Detect crawler user agents, serve pre-rendered content without the gate. Documented Google approach for SPAs. Workaround, not ideal, but it works.
A or B are better long-term. C is a pragmatic interim if A or B require significant refactoring. Worth talking through scope and timeline on the call.
Four new pages to create
/faq, /governance, /cabinda-refinery, /sustainability/kuma-program.
Outline content for each in snippets/new-pages-content.txt. Each needs server-rendered HTML, the title and description (in the TSV), OG tags (covered by the template change above), canonical (existing template handles this), BreadcrumbList schema (generated from URL path), and the page-specific schema from the gist.
Important: don’t share boilerplate between these and existing pages, or with each other; the recent cannibalization issues underline how easily that snowballs.
AI visibility: llms.txt, RSS feed, crawler access
Gemcorp doesn’t currently surface in answers from ChatGPT, Perplexity, Gemini, Claude, Copilot or Meta AI when asked about emerging market private credit or Africa-focused asset managers. Several peers do. Three small changes start fixing this:
a. /llms.txt
At the root, plain text (Content-Type: text/plain). Like robots.txt for AI models: tells them what the firm is and where to find key information. Full version in snippets/llms.txt (243 lines, covers every key page, team member, fund, news item, and regulatory fact).
b. robots.txt updates for AI crawlers
Explicit allow rules for GPTBot, Google-Extended, anthropic-ai, ClaudeBot, PerplexityBot, CCBot, Meta-ExternalAgent. See snippets/robots-ai-crawlers.txt.
c. RSS or Atom feed
At /feed/ or /rss.xml, latest 50 from /insight/ and /news/. Each item: title, link, pubDate, description (first 300 words), and author. Add an autodiscovery <link> to the <head> template; see snippets/rss-autodiscovery.html.
Combined effort here: less than a day. Foundation for Gemcorp to start appearing in AI-generated answers within roughly 4 to 8 weeks as platforms re-crawl.
Next step
If anything is unclear, we’re happy to
answer any questions or jump on a call if helps.
Thanks,
Amos Weiskopf, Rostrum Agency
a.weiskopf@rostrum.agency