Skip to content

Commit 1780760

Browse files
authored
Align blog and documentation with style guidelines and SEO improvements (#1)
1 parent 8def692 commit 1780760

19 files changed

Lines changed: 223 additions & 142 deletions

astro.config.mjs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,12 @@ export default defineConfig({
4242
}),
4343
mdx(),
4444
tailwind(),
45-
sitemap(),
45+
sitemap({
46+
serialize(item) {
47+
item.lastmod = new Date().toISOString();
48+
return item;
49+
},
50+
}),
4651
],
4752
markdown: {
4853
gfm: true,

src/components/AnimatedHero.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export function AnimatedHero() {
4040
</h1>
4141

4242
<p className="mt-5 font-mono text-[15px] leading-[200%] text-muted-foreground sm:max-w-[82%] lg:text-base lg:mt-6">
43-
Enterprise-grade dataflow analysis with code-native rules — no paywall, no pattern-matching compromises.
43+
Formal inter-procedural taint analysis — finds what pattern matching engines miss, enacts what LLM agents discover as rules, scales where neither can alone.
4444
</p>
4545

4646
<div className="mt-8 flex gap-3 sm:hidden">

src/components/astro/BlogPostView.astro

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const formattedDate = new Date(post.date).toLocaleDateString("en-US", {
3131

3232
{toc.length > 0 && (
3333
<div class="fixed inset-x-0 top-16 z-30 border-b border-border bg-background/95 backdrop-blur-md xl:hidden" data-mobile-toc>
34-
<div class="mx-auto max-w-[75rem]" style="padding-left: clamp(1.5rem, 0.5rem + 2vw, 3rem); padding-right: clamp(1.5rem, 0.5rem + 2vw, 3rem);">
34+
<div class="mx-auto w-full" style="padding-inline: clamp(1rem, 4vw, 6rem);">
3535
<details>
3636
<summary class="flex cursor-pointer list-none items-center gap-2 py-3 font-mono text-[10px] leading-none uppercase tracking-[0.14em] text-muted-foreground [&::-webkit-details-marker]:hidden">
3737
<span class="shrink-0">On this page</span>
@@ -59,11 +59,11 @@ const formattedDate = new Date(post.date).toLocaleDateString("en-US", {
5959

6060
<article>
6161
<section class="page-section">
62-
<h1 class="max-w-3xl break-words font-mono text-2xl font-semibold tracking-[-0.03em] text-foreground sm:text-3xl md:text-4xl lg:text-[2.5rem]">
62+
<h1 class="max-w-5xl break-words font-mono text-2xl font-semibold tracking-[-0.03em] text-foreground sm:text-3xl md:text-4xl lg:text-[2.5rem]">
6363
{post.title}
6464
</h1>
6565

66-
<p class="section-subtitle max-w-2xl break-words">
66+
<p class="section-subtitle max-w-4xl break-words">
6767
{post.description}
6868
</p>
6969

src/components/astro/FAQ.astro

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
const faqItems = [
33
{
44
question: "What is OpenTaint?",
5-
answer: "OpenTaint is an open source taint analysis engine built for the AI coding era. It performs inter-procedural dataflow analysis on Java and Kotlin bytecode — cross-endpoint flow tracking, persistence layer modelling, alias analysis, and asynchronous code analysis — using code-native rules to find real vulnerabilities in web applications. No paywall, no pattern-matching compromises.",
5+
answer: "OpenTaint is an open source taint analysis engine built for the AI coding era. It performs inter-procedural dataflow analysis on Java and Kotlin bytecode — cross-endpoint flow tracking, persistence layer modelling, alias analysis, and asynchronous code analysis. Code-native rules find real vulnerabilities in web applications. Finds what pattern matching engines miss, enacts what LLM agents discover as permanent rules, scales where neither can alone.",
66
},
77
{
88
question: "What vulnerabilities does OpenTaint detect?",
@@ -13,20 +13,20 @@ const faqItems = [
1313
answer: "Rules that look like code. Readable, writable, and tunable by humans and AI agents alike. The engine translates each rule into a full taint configuration — sources, sinks, sanitizers, and propagators connected by typed taint marks. When a rule produces a false positive, you refine the rule directly. No query language to learn, no black box to work around.",
1414
},
1515
{
16-
question: "Why not just use an AI agent for security scanning?",
17-
answer: "AI agents offer no formal guarantees. Run the same prompt twice and you may get different results — no determinism, no reproducibility. OpenTaint provides deterministic inter-procedural dataflow analysis with stable, reproducible findings. AI agents can read and write OpenTaint's code-native rules, so you get the best of both: AI flexibility with formal analysis underneath.",
16+
question: "Why not just use an LLM agent for security scanning?",
17+
answer: "LLM agents offer no formal guarantees. Run the same prompt twice and you may get different results — no determinism, no reproducibility. An LLM agent scanning a large codebase burns through token budgets and still can't guarantee full coverage. OpenTaint scans the same codebase in minutes of CPU compute — deterministically. AI agents can read and write OpenTaint's code-native rules, so you get the best of both: AI flexibility with formal analysis underneath.",
1818
},
1919
{
2020
question: "What languages and frameworks are supported?",
21-
answer: "Java and Kotlin, analyzed at the bytecode level to precisely understand inheritance, generics, and library interactions. Deep Spring Boot framework ecosystem support including Spring MVC, Spring Data, and related libraries. More languages ahead.",
21+
answer: "Java and Kotlin, analyzed at the bytecode level to precisely understand inheritance, generics, and library interactions. Deep Spring Boot support including Spring MVC, Spring Data, and related libraries. More languages ahead.",
2222
},
2323
{
2424
question: "How does OpenTaint compare to Semgrep?",
25-
answer: "Both tools perform inter-procedural analysis. OpenTaint goes further: it tracks data across endpoint boundaries and through persistence layers, catching stored injections and multi-step attack paths that basic inter-procedural analysis cannot reach. Rules use a code-native format that the engine translates into complete taint configurations. Semgrep rule syntax is supported as a migration path.",
25+
answer: "Semgrep's open-source engine does pattern matching. Its Pro engine adds taint analysis behind a paid tier. OpenTaint ships full inter-procedural dataflow analysis — cross-endpoint flows, persistence layers, stored injections — under Apache 2.0. Rules use a code-native format that the engine translates into complete taint configurations. Semgrep rule syntax is supported as a migration path.",
2626
},
2727
{
2828
question: "How does OpenTaint compare to CodeQL?",
29-
answer: "OpenTaint delivers enterprise-grade dataflow analysis without a specialized query language, proprietary licensing, or a paywall. Code-native rules mean you write what you know — code — and get full taint analysis out of the box.",
29+
answer: "CodeQL requires learning QL — a specialized query language that AI agents can't easily write. OpenTaint delivers formal inter-procedural dataflow analysis with code-native rules any developer or AI agent can read, write, and refine. No proprietary licensing, no paywall. Full taint analysis out of the box.",
3030
},
3131
{
3232
question: "Is OpenTaint free to use?",

src/components/astro/SiteHeader.astro

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
const navItems = [
33
{ href: "/", label: "Home" },
44
{ href: "/blog", label: "Blog" },
5+
{ href: "https://github.com/seqra/opentaint/tree/main/docs", label: "Docs", external: true },
56
];
67
---
78

89
<header class="fixed top-0 z-50 w-full border-b border-border bg-background/90 backdrop-blur-md">
9-
<div class="mx-auto flex h-16 max-w-[75rem] items-center px-4 sm:px-6">
10+
<div class="mx-auto flex h-16 w-full items-center" style="padding-inline: clamp(1rem, 4vw, 6rem);">
1011
<div class="flex-1">
1112
<a href="/" class="flex w-fit items-center" aria-label="OpenTaint home">
1213
<img src="/opentaint-header-light.svg" alt="opentaint logo" aria-hidden="true" class="h-10 dark:hidden sm:h-10" />
@@ -15,7 +16,7 @@ const navItems = [
1516
</div>
1617

1718
<nav class="hidden items-center gap-6 md:flex lg:gap-8" role="navigation" aria-label="Main navigation">
18-
{navItems.map((item) => <a href={item.href} class="font-mono text-sm font-medium uppercase tracking-[0.16em] text-muted-foreground transition-colors hover:text-primary lg:text-[15px]">{item.label}</a>)}
19+
{navItems.map((item) => <a href={item.href} target={item.external ? "_blank" : undefined} rel={item.external ? "noopener noreferrer" : undefined} class="font-mono text-sm font-medium uppercase tracking-[0.16em] text-muted-foreground transition-colors hover:text-primary lg:text-[15px]">{item.label}</a>)}
1920
</nav>
2021

2122
<div class="flex flex-1 items-center justify-end gap-2 sm:gap-3">
@@ -64,7 +65,7 @@ const navItems = [
6465
<div class="absolute left-0 right-0 top-full z-50 border-t border-border bg-background md:hidden">
6566
<nav class="container space-y-3 px-4 py-4" role="navigation" aria-label="Mobile navigation">
6667
{navItems.map((item) => (
67-
<a href={item.href} class="block py-1.5 font-mono text-sm font-medium uppercase tracking-[0.16em] text-muted-foreground transition-colors hover:text-primary">
68+
<a href={item.href} target={item.external ? "_blank" : undefined} rel={item.external ? "noopener noreferrer" : undefined} class="block py-1.5 font-mono text-sm font-medium uppercase tracking-[0.16em] text-muted-foreground transition-colors hover:text-primary">
6869
{item.label}
6970
</a>
7071
))}

src/components/astro/SupportedTechnology.astro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
<img src="/pictures/gitlab-logo.svg" alt="GitLab" class="h-10 w-10 sm:h-14 sm:w-14 lg:h-16 lg:w-16" />
1111
</div>
1212

13+
<h2 class="mt-10 section-title lg:mt-12">Enterprise-grade taint analysis for Java, Kotlin, and Spring Boot applications</h2>
14+
1315
<h2 class="mt-10 section-title lg:mt-12">Roadmap</h2>
1416
<div class="mt-4 flex flex-wrap items-center justify-center gap-y-5 gap-x-8 sm:gap-10 lg:mt-6 lg:gap-12">
1517
<img src="/pictures/python-logo.svg" alt="Python" class="h-10 w-10 sm:h-14 sm:w-14 lg:h-16 lg:w-16" />
Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,33 @@
11
---
22
const features = [
33
{
4-
title: "AI agent-ready.",
4+
title: "Find what pattern matching engines miss.",
55
description:
6-
"Agents operate the rules, the CLI, the output. Scan code, triage findings, fix vulnerabilities, refine rules.",
6+
"The inter-procedural dataflow engine tracks untrusted data across function boundaries, persistence layers, aliases, and async code. 100+ rules across 20+ vulnerability classes.",
77
},
88
{
9-
title: "Cutting-edge dataflow analysis.",
9+
title: "One finding becomes total coverage.",
1010
description:
11-
"Inter-procedural taint tracking across endpoints, persistence layers, aliases, and async code.",
12-
},
13-
{
14-
title: "Enterprise-grade, finds real trophies.",
15-
description:
16-
"Powerful, precise, and performant at scale. Catches exploitable vulnerabilities.",
17-
},
18-
{
19-
title: "Rules that read like code.",
20-
description:
21-
"Write and refine taint rules the same way you write application code — or let your AI agent do it.",
11+
"Code-native rules let you enact every uncovered vulnerability as a rule with the engine applying it across the entire codebase, deterministically, in minutes of CPU.",
2212
},
2313
{
2414
title: "Open source, batteries included.",
2515
description:
26-
"Engine, CLI, GitHub Action, GitLab CI, rules. Apache 2.0 and MIT licensed.",
16+
"Engine, rules, CI integrations — the entire stack ships under Apache 2.0 and MIT. No paid tier to unlock taint tracking, no gates on writing your own rules.",
2717
},
2818
];
2919
---
3020

3121
<section class="page-section" aria-labelledby="what-heading">
3222
<h2 id="what-heading" class="section-title text-center">Why OpenTaint?</h2>
3323
<p class="section-subtitle">
34-
AI-generated code is scaling codebases fast. Pattern matchers produce too many false positives. Enterprise taint analyzers that work are paywalled. AI agents in a security role give no formal guarantees.
24+
AI generates production code faster than today's security tooling can keep up with.
25+
</p>
26+
<p class="section-subtitle">
27+
LLM security agents find vulnerabilities humans miss, burn tokens on every file, and still can't guarantee they catch everything.
3528
</p>
3629
<p class="section-subtitle">
37-
OpenTaint does real inter-procedural taint analysis — tracks untrusted data from HTTP inputs to dangerous APIs across endpoints, persistence layers, and framework boundaries.
30+
The more AI writes code, the more you need formal methods underneath.
3831
</p>
3932

4033
<ul class="mt-8 space-y-3 lg:mt-10 lg:space-y-4">
@@ -49,10 +42,4 @@ const features = [
4942
))}
5043
</ul>
5144

52-
<div class="mt-8 lg:mt-10">
53-
<a href="/blog" class="cta-pill">
54-
<span>Read blog</span>
55-
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg>
56-
</a>
57-
</div>
5845
</section>

src/content.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const blog = defineCollection({
77
title: z.string(),
88
description: z.string(),
99
date: z.string(),
10+
keywords: z.array(z.string()).optional(),
11+
author: z.string().optional(),
1012
}),
1113
});
1214

0 commit comments

Comments
 (0)