Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": ["next/core-web-vitals", "prettier"]
}
35 changes: 35 additions & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
echo ""
echo "Starting Pre-commit Checks..."
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

echo "┌─ 📦 Checking Staged Files (Format & Lint)"
if npx lint-staged; then
echo "└─ Staged files look good!"
else
echo "└─ Code quality checks failed on staged files."
exit 1
fi

echo ""

echo "┌─ Checking TypeScript Types"
if npm run type-check; then
echo "└─ No type errors found"
else
echo "└─ TypeScript Check Failed. Please fix type errors."
exit 1
fi

echo ""

echo "┌─ Running Tests"
if npm test; then
echo "└─ Tests Passed"
else
echo "└─ Tests Failed."
exit 1
fi

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✨ All checks passed! Committing..."
echo ""
17 changes: 17 additions & 0 deletions .husky/pre-push
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
echo ""
echo "Starting Pre-push Checks..."
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

echo "┌─ 🏗️ Verifying Production Build"
echo "│ Running 'npm run build' to ensure strict linting and type safety..."
if npm run build; then
echo "└─ Build Successful"
else
echo "└─ Build Failed. Push aborted."
echo "│ Please fix the build errors before pushing."
exit 1
fi

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✨ Ready to push!"
echo ""
6 changes: 6 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"semi": true,
"singleQuote": false,
"tabWidth": 2,
"trailingComma": "es5"
}
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,20 @@ Website for https://continuousai.com
### Installation

1. Clone the repository:

```bash
git clone <repository-url>
cd continuousai-com
```

2. Install dependencies:

```bash
npm install
```

3. Run the development server:

```bash
npm run dev
```
Expand Down Expand Up @@ -60,4 +63,4 @@ Apache License 2.0 - See [LICENSE](LICENSE) for details.

Copyright 2025 Continue Dev, Inc.

Powered by [Continue](https://continue.dev)
Powered by [Continue](https://continue.dev)
36 changes: 26 additions & 10 deletions app/components/CursorTrail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,15 @@ export default function CursorTrail() {
// Track mouse position
const handleMouseMove = (e: MouseEvent) => {
mouseRef.current = { x: e.clientX, y: e.clientY };

// Transition between colors faster
colorTransitionRef.current++;
if (colorTransitionRef.current > 15) { // Change color every 15 particles
if (colorTransitionRef.current > 15) {
// Change color every 15 particles
colorTransitionRef.current = 0;
colorIndexRef.current = (colorIndexRef.current + 1) % COLORS.length;
}

// Create wispy, elongated particles for smoke effect
const maxLife = Math.random() * 100 + 80; // Longer life
particlesRef.current.push({
Expand Down Expand Up @@ -102,14 +103,14 @@ export default function CursorTrail() {

// Get color for this particle
const color = COLORS[particle.colorIndex];

// Save context state
ctx.save();

// Move to particle position and rotate
ctx.translate(particle.x, particle.y);
ctx.rotate(particle.rotation);

// Create elliptical gradient for wispy smoke
const gradient = ctx.createRadialGradient(
0,
Expand All @@ -122,17 +123,32 @@ export default function CursorTrail() {

// Very soft, wispy smoke effect
const alpha = opacity * 0.25;
gradient.addColorStop(0, `${color}${Math.floor(alpha * 255).toString(16).padStart(2, '0')}`);
gradient.addColorStop(0.3, `${color}${Math.floor(alpha * 0.6 * 255).toString(16).padStart(2, '0')}`);
gradient.addColorStop(0.7, `${color}${Math.floor(alpha * 0.2 * 255).toString(16).padStart(2, '0')}`);
gradient.addColorStop(
0,
`${color}${Math.floor(alpha * 255)
.toString(16)
.padStart(2, "0")}`
);
gradient.addColorStop(
0.3,
`${color}${Math.floor(alpha * 0.6 * 255)
.toString(16)
.padStart(2, "0")}`
);
gradient.addColorStop(
0.7,
`${color}${Math.floor(alpha * 0.2 * 255)
.toString(16)
.padStart(2, "0")}`
);
gradient.addColorStop(1, `${color}00`);

// Draw elongated ellipse for wisp effect
ctx.fillStyle = gradient;
ctx.beginPath();
ctx.ellipse(0, 0, particle.sizeX, particle.sizeY, 0, 0, Math.PI * 2);
ctx.fill();

// Restore context state
ctx.restore();

Expand Down
39 changes: 25 additions & 14 deletions app/components/MobiusStrip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ export default function MobiusStrip() {

// Möbius strip parameters
const R = 120; // Major radius (distance from center to the middle of the strip)
const w = 40; // Width of the strip
const w = 40; // Width of the strip

const drawMobiusStrip = (rotationY: number, rotationX: number) => {
ctx.clearRect(0, 0, width, height);

// Generate points for the Möbius strip
const segments = 100; // Number of segments around the strip
const strips = 20; // Number of strips across the width
const strips = 20; // Number of strips across the width

const points: Array<{
x: number;
Expand All @@ -42,7 +42,7 @@ export default function MobiusStrip() {
for (let i = 0; i <= segments; i++) {
for (let j = 0; j <= strips; j++) {
const u = (i / segments) * Math.PI * 2; // Parameter around the circle [0, 2π]
const v = ((j / strips) - 0.5) * 2 * w; // Parameter across the width [-w, w]
const v = (j / strips - 0.5) * 2 * w; // Parameter across the width [-w, w]

// Möbius strip parametric equations
// The key is the u/2 in the twist, giving it the single twist characteristic
Expand Down Expand Up @@ -99,8 +99,15 @@ export default function MobiusStrip() {
// Color based on position - rainbow gradient
const colorIndex = Math.floor(((i / segments) * 9) % 9);
const colors = [
"#F637B3", "#EB54F6", "#B25AF6", "#667AFF", "#2EA6FF",
"#00D2FF", "#31DDED", "#60E6D5", "#89EC9B"
"#F637B3",
"#EB54F6",
"#B25AF6",
"#667AFF",
"#2EA6FF",
"#00D2FF",
"#31DDED",
"#60E6D5",
"#89EC9B",
];
const color = colors[colorIndex];

Expand Down Expand Up @@ -142,9 +149,18 @@ export default function MobiusStrip() {
// Helper function to adjust brightness
const adjustBrightness = (color: string, factor: number): string => {
const hex = color.replace("#", "");
const r = Math.min(255, Math.floor(parseInt(hex.slice(0, 2), 16) * factor));
const g = Math.min(255, Math.floor(parseInt(hex.slice(2, 4), 16) * factor));
const b = Math.min(255, Math.floor(parseInt(hex.slice(4, 6), 16) * factor));
const r = Math.min(
255,
Math.floor(parseInt(hex.slice(0, 2), 16) * factor)
);
const g = Math.min(
255,
Math.floor(parseInt(hex.slice(2, 4), 16) * factor)
);
const b = Math.min(
255,
Math.floor(parseInt(hex.slice(4, 6), 16) * factor)
);
return `rgb(${r}, ${g}, ${b})`;
};

Expand All @@ -166,11 +182,6 @@ export default function MobiusStrip() {
}, []);

return (
<canvas
ref={canvasRef}
width={800}
height={600}
className="mx-auto"
/>
<canvas ref={canvasRef} width={800} height={600} className="mx-auto" />
);
}
18 changes: 14 additions & 4 deletions app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@ body {
padding: 0px 1px;
padding-right: 0px;
z-index: 1;
transition: text-decoration-color 0.3s ease, padding-right 0.3s ease;
transition:
text-decoration-color 0.3s ease,
padding-right 0.3s ease;
}

.animated-link::before {
Expand Down Expand Up @@ -80,7 +82,10 @@ body {
vertical-align: middle;
opacity: 0;
transform: translateY(-0.1em) translateX(-4px);
transition: opacity 0.4s ease, transform 0.4s ease, width 0.4s ease,
transition:
opacity 0.4s ease,
transform 0.4s ease,
width 0.4s ease,
margin-left 0.4s ease;
}

Expand All @@ -106,7 +111,9 @@ body {
padding: 0px 1px;
padding-right: 0px;
z-index: 1;
transition: text-decoration-color 0.3s ease, padding-right 0.3s ease;
transition:
text-decoration-color 0.3s ease,
padding-right 0.3s ease;
}

.animated-anchor::before {
Expand Down Expand Up @@ -134,7 +141,10 @@ body {
vertical-align: middle;
opacity: 0;
transform: translateY(-0.1em) translateX(-4px);
transition: opacity 0.4s ease, transform 0.4s ease, width 0.4s ease,
transition:
opacity 0.4s ease,
transform 0.4s ease,
width 0.4s ease,
margin-left 0.4s ease;
}

Expand Down
8 changes: 6 additions & 2 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export const metadata: Metadata = {
title: "Continuous AI",
description: "The practice of developing software with background agents",
icons: {
icon: '/favicon.svg?v=4',
icon: "/favicon.svg?v=4",
},
};

Expand All @@ -18,7 +18,11 @@ export default function RootLayout({
<html lang="en">
<head>
<link rel="icon" href="/favicon.svg?v=4" type="image/svg+xml" />
<link rel="alternate icon" href="/favicon.svg?v=4" type="image/svg+xml" />
<link
rel="alternate icon"
href="/favicon.svg?v=4"
type="image/svg+xml"
/>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link
rel="preconnect"
Expand Down
59 changes: 32 additions & 27 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,36 +38,41 @@ export default function Home() {
<>
<CursorTrail />
<div className="min-h-screen px-8 sm:px-20 flex flex-col">
<div className="flex-1 flex items-center justify-center">
<div className="max-w-4xl mx-auto text-center">
<h1 className="font-['Molengo',sans-serif] text-[48px] sm:text-[56px] text-white mb-12 leading-tight">
Continuous AI
</h1>
<div className="flex-1 flex items-center justify-center">
<div className="max-w-4xl mx-auto text-center">
<h1 className="font-['Molengo',sans-serif] text-[48px] sm:text-[56px] text-white mb-12 leading-tight">
Continuous AI
</h1>

<p className="font-['Molengo',sans-serif] text-[20px] sm:text-[26px] text-white leading-relaxed text-balance">
Developers are drowning in AI-generated code. Continuous AI addresses this by automating the workflows around code, not just the code itself. The role of the software engineer is shifting from prompting AI to designing processes that run automatically.
</p>
<p className="font-['Molengo',sans-serif] text-[20px] sm:text-[26px] text-white leading-relaxed text-balance">
Developers are drowning in AI-generated code. Continuous AI
addresses this by automating the workflows around code, not just
the code itself. The role of the software engineer is shifting
from prompting AI to designing processes that run automatically.
</p>
</div>
</div>
</div>

<footer className="pb-16 sm:pb-8 pt-4">
<div className="flex flex-col items-center justify-center gap-0.5">
<span className="font-['Molengo',sans-serif] text-white text-base tracking-wider opacity-50">Powered by</span>
<a
href="https://continue.dev"
target="_blank"
rel="noopener noreferrer"
className="hover:opacity-80 transition-opacity"
>
<img
src="/continue-logo-white.svg"
alt="Continue"
className="h-12 w-auto"
/>
</a>
</div>
</footer>
</div>
<footer className="pb-16 sm:pb-8 pt-4">
<div className="flex flex-col items-center justify-center gap-0.5">
<span className="font-['Molengo',sans-serif] text-white text-base tracking-wider opacity-50">
Powered by
</span>
<a
href="https://continue.dev"
target="_blank"
rel="noopener noreferrer"
className="hover:opacity-80 transition-opacity"
>
<img
src="/continue-logo-white.svg"
alt="Continue"
className="h-12 w-auto"
/>
</a>
</div>
</footer>
</div>
</>
);
}
11 changes: 11 additions & 0 deletions lint-staged.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const path = require("path");

const buildEslintCommand = (filenames) =>
`next lint --fix --file ${filenames
.map((f) => path.relative(process.cwd(), f))
.join(" --file ")}`;

module.exports = {
"*.{js,jsx,ts,tsx}": [buildEslintCommand, "prettier --write"],
"*.{json,css,md}": ["prettier --write"],
};
Loading