From bf90d752dbd0397aa3e332e9dd7da92ccc4d95ad Mon Sep 17 00:00:00 2001 From: "Zeko (Hermes)" Date: Fri, 5 Jun 2026 08:57:29 +0700 Subject: [PATCH 1/3] feat(website): landing page refresh + docs updates - Rewrite landing page with uteke structure (hero, KPI stats, terminal demo, how-it-works, features grid, comparison table, quick start, CTA) - Fix GitHub links: ajianaz/cora-cli to codecoradev/cora-cli - Fix install command: cargo install to curl -fsSL | sh - Fix /docs redirect: cli-reference to getting-started - Add Roadmap page (v0.1.5-v0.4.0 done, Phase A/B future) - Add Roadmap link to docs sidebar - Add CSS utilities (separator-gradient, grid-bg, timeline, etc) --- website/src/app.css | 110 +++ website/src/routes/+layout.svelte | 43 +- website/src/routes/+page.svelte | 926 ++++++++++--------- website/src/routes/docs/+layout.svelte | 1 + website/src/routes/docs/+page.svelte | 2 +- website/src/routes/docs/roadmap/+page.svelte | 141 +++ 6 files changed, 773 insertions(+), 450 deletions(-) create mode 100644 website/src/routes/docs/roadmap/+page.svelte diff --git a/website/src/app.css b/website/src/app.css index eb16a7aa..d0b315da 100644 --- a/website/src/app.css +++ b/website/src/app.css @@ -587,3 +587,113 @@ code, .font-mono { padding: var(--space-6) var(--space-4) var(--space-12); } } + +/* ---- Separator Gradient ---- */ +.separator-gradient { + max-width: 1152px; + margin-left: auto; + margin-right: auto; + padding-left: var(--space-6); + padding-right: var(--space-6); + height: 1px; + background: linear-gradient( + 90deg, + transparent, + oklch(0.65 0.22 270 / 0.3), + transparent + ); +} + +@media (min-width: 768px) { + .separator-gradient { + padding-left: var(--space-8); + padding-right: var(--space-8); + } +} + +@media (min-width: 1280px) { + .separator-gradient { + padding-left: var(--space-10); + padding-right: var(--space-10); + } +} + +/* ---- Grid Background ---- */ +.grid-bg { + background-image: + linear-gradient(oklch(0.27 0.01 270 / 0.3) 1px, transparent 1px), + linear-gradient(90deg, oklch(0.27 0.01 270 / 0.3) 1px, transparent 1px); + background-size: 64px 64px; +} + +/* ---- Architecture Flow ---- */ +.arch-step { + width: 100%; + max-width: 320px; + padding: var(--space-5) var(--space-6); + border-radius: var(--space-4); + background: var(--card); + border: 1px solid oklch(0.27 0.01 270 / 0.5); + text-align: center; +} + +.arch-step-highlight { + width: 100%; + max-width: 320px; + padding: var(--space-5) var(--space-6); + border-radius: var(--space-4); + text-align: center; + border: 2px solid var(--accent); + background: oklch(0.65 0.22 270 / 0.08); +} + +.arch-connector { + display: flex; + flex-direction: column; + align-items: center; + padding: var(--space-1) 0; +} + +.arch-connector-line { + width: 1px; + height: var(--space-4); + background: oklch(0.65 0.22 270 / 0.3); +} + +.arch-connector-label { + padding: var(--space-1) var(--space-3); + border-radius: var(--space-1); + font-family: var(--font-mono); + font-size: 12px; + color: var(--accent); + background: var(--card); + border: 1px solid oklch(0.65 0.22 270 / 0.2); +} + +/* ---- Audience Table ---- */ +.audience-table { + width: 100%; + border-collapse: collapse; +} + +.audience-table th, +.audience-table td { + padding: var(--space-3) var(--space-5); + border-bottom: 1px solid oklch(0.27 0.01 270 / 0.5); + text-align: left; + font-size: 14px; + color: var(--foreground); +} + +.audience-table thead th { + color: var(--muted-foreground); + font-weight: 500; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.05em; + padding-bottom: var(--space-3); +} + +.audience-table tbody tr:last-child td { + border-bottom: none; +} diff --git a/website/src/routes/+layout.svelte b/website/src/routes/+layout.svelte index 43d67712..6445718e 100644 --- a/website/src/routes/+layout.svelte +++ b/website/src/routes/+layout.svelte @@ -7,35 +7,34 @@ const isDocs = $derived($page.url.pathname.startsWith('/docs')); -
- + -
+
{@render children()}
- -
-
- ยฉ 2026 cora โ€” AI code review CLI ยท MIT License -
- GitHub - Docs - MIT -
-
-
diff --git a/website/src/routes/+page.svelte b/website/src/routes/+page.svelte index 14c351f6..2d7725c7 100644 --- a/website/src/routes/+page.svelte +++ b/website/src/routes/+page.svelte @@ -1,475 +1,547 @@ - cora โ€” AI Code Review CLI ยท Open Source ยท MIT - - - - - - - - - + cora โ€” AI Code Review CLI + - -
-
- -
- -
- - v0.4 released - โ€” - release notes โ†’ -
- - -

- Ship with
- Confidence. -

+
- -

- AI code review, before you commit. - CLI-first, BYOK any LLM, deterministic rules, fully open source. -

+ +
+ +
- -
-
- $ - curl -fsSL https://cora.dev/install.sh | sh - +
+ +
+ + + AI Code Review for Developers +
-
- MIT License - ยท - No account - ยท - No telemetry + +

+ Review code.
+ Ship faster. +

+ + +

+ cora catches bugs, security issues, and style violations before they merge. CLI-first. BYOK. Runs in your terminal. +

+ + +
+
+
+ + + + Terminal +
+
+ $ + curl -fsSL https://cora.dev/install | sh + + +
+
-
- - - GitHub + + + + +

+ MIT License · No account · OpenAI · Anthropic · Groq · Ollama +

-
-
- - -
-
- -
-
-
-
-
+
+ + +
+

+ Trusted by developers who ship fast +

+
+
+
5
+
AI Providers
+
+
+
< 3s
+
Review Time
+
+
+
Zero
+
Config Required
- cora โ€” AI code review engine
+
- -
- {#each commands as c, i} -
- {#if i === visibleCmd} -
- โฏ -
- {c.cmd.split(' ')[0]} - {c.cmd.split(' ').slice(1).join(' ')} -
-
-

# {c.desc}

-
{c.output}
- {:else} -
- โฏ - {c.cmd} -
+ +
+

+ See it in action +

+

+ Run cora against staged changes. Results in seconds, not minutes. +

+ +
+
+
+ + + + cora \u2014 review +
+
+ {#each terminalLines as line, i} +
{line}
+ {/each} + {#if terminalComplete} + {/if}
- {/each} -
-
-
- - -
-
-
- ๐Ÿฆ€ - Built with Rust -
-
- ๐Ÿ”’ - Zero Telemetry -
-
- โšก - Pre-commit Hooks -
-
- ๐Ÿ›ก๏ธ - Rules Engine -
-
- ๐Ÿ”‘ - BYOK Any LLM -
-
- ๐Ÿ“ฆ - Single Binary +
-
-
- -
- - -
-
-

The Problem

-

- Code review shouldn't be
- slow or expensive +

+ + +
+

+ How it works

-

- Stop waiting hours for feedback. cora catches issues in seconds โ€” before you commit. +

+ Three steps from code to confidence.

- - -
-
- -
-

โŒ Without cora

-
-

> Waiting for PR review...

-

Still waiting (4 hours)

-

> Reviewer missed the SQL injection

-

Merged to production with bug

-

> Now paying $12/mo per reviewer seat

+ +
+ +
+
01
+
+
+

Write code

+

Push your changes as normal. cora only sees your diff.

+
+ + + - -
-

โœ… With cora

-
-

> git commit -m "feat: auth"

-

cora review: 2 issues found (0.8s)

-

> Fixed both issues, committed

-

Zero cost. Zero waiting. Zero bugs shipped.

+ +
+
02
+
+
+

Review with AI

+

cora analyzes your diff with the LLM of your choice.

+
+ + + + + +
+
03
+
+ +
+

Ship with confidence

+

Merge clean, production-ready code. Every time.

-
-
- -
- - -
-
-

Features

-

Everything you need.
Nothing you don't.

-
- -
- {#each features as feat} -
- {feat.icon} -

{feat.title}

-

{feat.desc}

-

{feat.detail}

+
+ + +
+

+ Built for developers who value control +

+

+ Everything you need, nothing you don't. +

+ +
+ +
+
+ +
+

AI Code Review

+

Diff, branch, or full scan

+

Three review modes: staged diff, branch comparison, or full project scan. LLM-powered analysis catches bugs, security issues, and style violations.

- {/each} -
-
- -
- - -
-
-

Get Started

-

Three steps to
confident commits

-
- -
-
-
1
-
-

Install

- - curl -fsSL https://cora.dev/install.sh | sh - + + +
+
+ +
+

Bring Your Own Key

+

No subscriptions, no lock-in

+

Uses YOUR OpenAI, Anthropic, Groq, Ollama, or Z.AI API key. No data stored on our servers. You control the model, you control the cost.

+
+ + +
+
+ +
+

Pre-commit Hooks

+

Review before you push

+

Install once. Every commit gets reviewed automatically. Block bad code from entering your branch before it ships.

+
+ + +
+
+ +
+

Incremental Scan

+

Only scan what changed

+

SHA256 content hash cache. First scan indexes your codebase. Subsequent scans only review new or modified files.

+
+ + +
+
+ +
+

SARIF Output

+

GitHub Code Scanning

+

Upload review findings directly to GitHub's Security tab. Track issues across PRs. Works with any CI/CD pipeline.

+
+ + +
+
+ +
+

Fully Private

+

Your code stays yours

+

Runs entirely on your machine. No cloud, no telemetry, no data leaving your network. Perfect for Gitea and air-gapped environments.

+
+ + +
+
+ +
+

Deterministic Reviews

+

Same diff, same issues

+

Temperature defaults to 0. Identical diffs always produce identical findings โ€” perfect for CI reproducibility.

+
+ + +
+
+ +
+

Smart Caching

+

Never review the same diff twice

+

Reviews are cached by diff hash in ~/.cache/cora/reviews/. Re-reviewing an unchanged diff returns cached results instantly. Use --no-cache to bypass.

+
+ + +
+
+ +
+

Custom Prompts & Anti-Hallucination

+

Control the review, trust the output

+

Override system prompts for review and scan. File path injection and post-parse filtering ensure the LLM only reports issues that exist in your actual diff.

-
-
2
-
-

Configure your LLM

- - cora init - +
+ + +
+

+ Why developers choose cora +

+

+ Side-by-side with popular code review tools. +

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeaturecoraCodeRabbitCopilotSonarQube
BYOK✓✗✗—
Self-hosted✓✗✗✓
Gitea✓✗✗✓
CLI✓✗✗✗
Pre-commit✓✗✗✗
SARIF✓✓✓✓
CostFree + API$12-39/mo$10-39/moFree / $150+
LicenseMITApache 2.0ProprietaryLGPL
-
-
3
-
-

Review your code

- - cora review --staged - +
+ + +
+

+ Start in 30 seconds +

+

+ No account required. No subscription. No cloud. +

+ +
+ +
+
1
+
+

Install

+

Single binary, no dependencies.

+
+
+ + + +
+
+ $ curl -fsSL https://cora.dev/install | sh +
+
+
+
+ + +
+
2
+
+

Set API key

+

Use your existing OpenAI or Anthropic key.

+
+
+ + + +
+
+ $ export OPENAI_API_KEY="sk-..." +
+
+
+
+ + +
+
3
+
+

Review

+

Review your staged changes.

+
+
+ + + +
+
+ $ CORA_API_KEY=key cora review --staged +
+
+
+
+ + +
+
4
+
+

Done

+

That's it. No account. No subscription.

+
-
-
โœ“
-
-

That's it. No account. No server. No lock-in.

-

Works out of the box with sensible defaults. Customize with .cora.yaml when you need more control.

+ + +
+

+ Ready to ship better code? +

+

+ No account. No subscription. No cloud. +

+
-
-
- -
- - -
-
-

Compare

-

Why developers choose cora

-
- -
- - - - - - - - - - - - {#each comparisons as row} - - - - - - - - {/each} - -
Featurecora
{row.feature}{row.cora}
-
-
- -
- - -
-
-

FAQ

-

Frequently asked questions

-
- -
- {#each faqs as faq, i} -
openFaq = openFaq === i ? null : i} - onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openFaq = openFaq === i ? null : i; } }} - > -
- {faq.q} - + + + +
+
+
+ cora + MIT License +
+
+ GitHub + Docs
- {#if openFaq === i} - {faq.a} - {/if}
- {/each} -
-
- -
- - -
-

- Ready to ship
- better code? -

-

Free forever ยท No account required ยท Start in 30 seconds

- -
+ + + diff --git a/website/src/routes/docs/+layout.svelte b/website/src/routes/docs/+layout.svelte index 6448fd74..892856c5 100644 --- a/website/src/routes/docs/+layout.svelte +++ b/website/src/routes/docs/+layout.svelte @@ -10,6 +10,7 @@ { href: '/docs/configuration', label: 'Configuration' }, { href: '/docs/providers', label: 'Providers' }, { href: '/docs/examples', label: 'Examples' }, + { href: '/docs/roadmap', label: 'Roadmap' }, { href: '/docs/cli-reference', label: 'CLI Reference' }, { href: '/docs/changelog', label: 'Changelog' }, ]; diff --git a/website/src/routes/docs/+page.svelte b/website/src/routes/docs/+page.svelte index dde29ff7..03587b18 100644 --- a/website/src/routes/docs/+page.svelte +++ b/website/src/routes/docs/+page.svelte @@ -1,5 +1,5 @@ diff --git a/website/src/routes/docs/roadmap/+page.svelte b/website/src/routes/docs/roadmap/+page.svelte new file mode 100644 index 00000000..609e188a --- /dev/null +++ b/website/src/routes/docs/roadmap/+page.svelte @@ -0,0 +1,141 @@ + + Roadmap โ€” cora Docs + + +

Roadmap

+ +

Demand-gated โ€” we build what people actually need. Track progress on GitHub Issues.

+ +
+ + +
+

+ v0.1.5 + Initial Release +

+
+ {#each [ + 'Basic diff review with OpenAI', + 'CLI interface with review command', + 'Staged/unstaged file detection', + 'JSON output format', + ] as item} +
+ {item} + โœ“ Done +
+ {/each} +
+
+ + +
+

+ v0.2.0 + Multi-Provider & Deterministic Rules +

+
+ {#each [ + 'BYOK โ€” Anthropic, Groq, Ollama support', + 'Deterministic rule engine (12 built-in)', + 'SARIF output format', + 'Branch review mode', + ] as item} +
+ {item} + โœ“ Done +
+ {/each} +
+
+ + +
+

+ v0.3.0 + Scan Engine & Caching +

+
+ {#each [ + 'Full project scan (cora scan)', + 'SHA256 diff-hash caching', + 'Incremental scan mode', + 'Cross-file context chain (5 languages)', + 'Pre-commit hooks (cora hook install)', + ] as item} +
+ {item} + โœ“ Done +
+ {/each} +
+
+ + +
+

+ v0.4.0 + SARIF Upload & Polish +

+
+ {#each [ + 'SARIF upload to GitHub Code Scanning', + 'Custom review/scan prompts', + 'Anti-hallucination filtering', + 'Shell completions (bash/zsh/fish)', + 'Z.AI provider support', + ] as item} +
+ {item} + โœ“ Done +
+ {/each} +
+
+ + +
+

+ Phase A + Ecosystem & Performance +

+

Shipped on demand โ€” prioritized by community requests.

+
+ {#each [ + { title: 'Homebrew tap (brew install cora)', status: 'Planned' }, + { title: 'Parallel file review (multi-threaded)', status: 'Planned' }, + { title: 'Review summary (compact / detailed mode)', status: 'Planned' }, + { title: 'GitLab CI/CD integration guide', status: 'Planned' }, + ] as item} +
+ {item.title} + {item.status} +
+ {/each} +
+
+ + +
+

+ Phase B + Editor & Team Features +

+

Requires sufficient community adoption.

+
+ {#each [ + 'VS Code extension (LSP-based)', + 'JetBrains plugin', + 'Team config (.cora.yaml inheritance)', + 'Custom rule authoring API', + ] as item} +
+ {item} + Future +
+ {/each} +
+
+ +
From 6c44980fb7f094a877d3057825d046b7bbaa6a7b Mon Sep 17 00:00:00 2001 From: "Zeko (Hermes)" Date: Fri, 5 Jun 2026 09:09:12 +0700 Subject: [PATCH 2/3] fix(website): clipboard async + upgrade CI workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix clipboard.writeText() โ€” add async/await + error handling (CodeCora) - CI: add main to PR triggers (was only develop) - CI: add website-lint (svelte-check), website-build, npm-audit, cargo-outdated - Total 10 jobs: check, fmt, clippy, audit, test, build, website-lint, website-build, npm-audit, cargo-outdated --- .github/workflows/ci.yml | 65 ++++++++++++++++++++++++++++++++- website/src/routes/+page.svelte | 10 +++-- 2 files changed, 69 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 81c14327..08903ba5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: pull_request: - branches: [develop] + branches: [develop, main] push: branches: [main] @@ -18,6 +18,7 @@ permissions: id-token: write jobs: + # โ”€โ”€ Rust โ”€โ”€ check: name: Check runs-on: ubuntu-latest @@ -49,7 +50,7 @@ jobs: - run: cargo clippy --all-targets -- -D warnings audit: - name: Security Audit + name: Security Audit (CVE) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -75,4 +76,64 @@ jobs: - uses: Swatinem/rust-cache@v2 - run: cargo build --release + # โ”€โ”€ Website โ”€โ”€ + website-lint: + name: Website Lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + cache-dependency-path: website/package-lock.json + - run: npm ci + working-directory: website + - run: npx svelte-check --tsconfig ./tsconfig.json --output human + working-directory: website + + website-build: + name: Website Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + cache-dependency-path: website/package-lock.json + - run: npm ci + working-directory: website + - run: npm run build + working-directory: website + - name: Verify build output + run: | + if [ ! -d "website/build" ] || [ -z "$(ls -A website/build)" ]; then + echo "::error::Build output is empty or missing." + exit 1 + fi + # โ”€โ”€ Dependency freshness โ”€โ”€ + npm-audit: + name: NPM Audit + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + cache-dependency-path: website/package-lock.json + - run: npm audit --audit-level=moderate || true + working-directory: website + + cargo-outdated: + name: Cargo Outdated + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - name: Install cargo-outdated + run: cargo install cargo-outdated --locked 2>/dev/null || true + - run: cargo outdated || true diff --git a/website/src/routes/+page.svelte b/website/src/routes/+page.svelte index 2d7725c7..208c5d69 100644 --- a/website/src/routes/+page.svelte +++ b/website/src/routes/+page.svelte @@ -21,10 +21,12 @@ ]; let copyClicked = $state(false); - function copyInstall() { - navigator.clipboard.writeText('curl -fsSL https://cora.dev/install | sh'); - copyClicked = true; - setTimeout(() => { copyClicked = false; }, 2000); + async function copyInstall() { + try { + await navigator.clipboard.writeText('curl -fsSL https://cora.dev/install | sh'); + copyClicked = true; + setTimeout(() => { copyClicked = false; }, 2000); + } catch { /* clipboard not available */ } } onMount(() => { From c5fce61844068a63c29b175deb7efc0b0c5882fc Mon Sep 17 00:00:00 2001 From: "Zeko (Hermes)" Date: Fri, 5 Jun 2026 09:20:14 +0700 Subject: [PATCH 3/3] fix(website): IntersectionObserver cleanup on unmount (CodeCora) - Return cleanup function from onMount to disconnect observers - Store typeInterval in component scope for cleanup - Prevents memory leaks and state updates on destroyed component --- website/src/routes/+page.svelte | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/website/src/routes/+page.svelte b/website/src/routes/+page.svelte index 208c5d69..d543f9a1 100644 --- a/website/src/routes/+page.svelte +++ b/website/src/routes/+page.svelte @@ -29,6 +29,8 @@ } catch { /* clipboard not available */ } } + let typeInterval: ReturnType | null = null; + onMount(() => { // Scroll reveal observer const observer = new IntersectionObserver( @@ -52,13 +54,13 @@ if (entry.isIntersecting && !demoStarted) { demoStarted = true; let lineIndex = 0; - const typeInterval = setInterval(() => { + typeInterval = setInterval(() => { if (lineIndex < terminalOutput.length) { terminalLines = [...terminalLines, terminalOutput[lineIndex].text]; lineIndex++; } else { terminalComplete = true; - clearInterval(typeInterval); + if (typeInterval) clearInterval(typeInterval); } }, 200); } @@ -69,6 +71,13 @@ const demoEl = document.getElementById('demo-terminal'); if (demoEl) demoObserver.observe(demoEl); + + // Cleanup on unmount + return () => { + observer.disconnect(); + demoObserver.disconnect(); + if (typeInterval) clearInterval(typeInterval); + }; });