Skip to content

Commit 3b2ec1b

Browse files
authored
Merge pull request #157 from iHildy/feature/add-stats
stats prototype implemented on landing page + more
2 parents d94e767 + 4fbf891 commit 3b2ec1b

16 files changed

Lines changed: 231 additions & 45 deletions

File tree

AGENTS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ Contents of the README.md file:
2222

2323
---
2424

25-
Jules Task Queue is a GitHub-integrated service that solves the "5 concurrent task" bottleneck when using the Google Labs - Jules AI coding assistant. It automatically queues tasks when Jules hits its limit and retries them later, allowing you to seamlessly utilize your full daily quota.
25+
Jules Task Queue is a GitHub-integrated service that solves the "3 concurrent task" bottleneck when using the Google Labs - Jules AI coding assistant. It automatically queues tasks when Jules hits its limit and retries them later, allowing you to seamlessly utilize your full daily quota.
2626

27-
## The Problem: The 5-Task Bottleneck
27+
## The Problem: The 3-Task Bottleneck
2828

29-
> "Jules gives you 60 tasks per day but only 5 concurrent slots. So you're constantly babysitting the queue, manually re-adding labels every time it hits the limit. There has to be a better way."
29+
> "Jules gives you 15 tasks per day but only 3 concurrent slots.\* So you're constantly babysitting the queue, manually re-adding labels every time it hits the limit. There has to be a better way."
3030
> — Every Jules power user, probably
3131
3232
This tool is the better way. It transforms Jules from a tool you have to manage into a true "set it and forget it" automation partner.

GEMINI.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ Contents of the README.md file:
2222

2323
---
2424

25-
Jules Task Queue is a GitHub-integrated service that solves the "5 concurrent task" bottleneck when using the Google Labs - Jules AI coding assistant. It automatically queues tasks when Jules hits its limit and retries them later, allowing you to seamlessly utilize your full daily quota.
25+
Jules Task Queue is a GitHub-integrated service that solves the "3 concurrent task" bottleneck when using the Google Labs - Jules AI coding assistant. It automatically queues tasks when Jules hits its limit and retries them later, allowing you to seamlessly utilize your full daily quota.
2626

27-
## The Problem: The 5-Task Bottleneck
27+
## The Problem: The 3-Task Bottleneck
2828

29-
> "Jules gives you 60 tasks per day but only 5 concurrent slots. So you're constantly babysitting the queue, manually re-adding labels every time it hits the limit. There has to be a better way."
29+
> "Jules gives you 15 tasks per day but only 3 concurrent slots.\* So you're constantly babysitting the queue, manually re-adding labels every time it hits the limit. There has to be a better way."
3030
> — Every Jules power user, probably
3131
3232
This tool is the better way. It transforms Jules from a tool you have to manage into a true "set it and forget it" automation partner.

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919

2020
---
2121

22-
Jules Task Queue is a GitHub-integrated service that solves the "5 concurrent task" bottleneck when using the Google Labs - Jules AI coding assistant. It automatically queues tasks when Jules hits its limit and retries them later, allowing you to seamlessly utilize your full daily quota.
22+
Jules Task Queue is a GitHub-integrated service that solves the "3 concurrent task" bottleneck when using the Google Labs - Jules AI coding assistant. It automatically queues tasks when Jules hits its limit and retries them later, allowing you to seamlessly utilize your full daily quota.
2323

24-
## The Problem: The 5-Task Bottleneck
24+
## The Problem: The 3-Task Bottleneck
2525

26-
> "Jules gives you 60 tasks per day but only 5 concurrent slots. So you're constantly babysitting the queue, manually re-adding labels every time it hits the limit. There has to be a better way."
26+
> "Jules gives you 15 tasks per day but only 3 concurrent slots.\* So you're constantly babysitting the queue, manually re-adding labels every time it hits the limit. There has to be a better way."
2727
> — Every Jules power user, probably
2828
2929
This tool is the better way. It transforms Jules from a tool you have to manage into a true "set it and forget it" automation partner.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- CreateIndex
2+
CREATE INDEX "jules_tasks_flaggedForRetry_createdAt_idx" ON "jules_tasks"("flaggedForRetry", "createdAt");

prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ model JulesTask {
3939
@@index([repoOwner, repoName])
4040
@@index([createdAt])
4141
@@index([installationId])
42+
@@index([flaggedForRetry, createdAt]) // Composite index for stats queries
4243
@@map("jules_tasks")
4344
}
4445

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { db } from "@/server/db";
2+
import { NextResponse } from "next/server";
3+
4+
export async function GET() {
5+
try {
6+
const totalRepositories = await db.installationRepository.count({
7+
where: {
8+
removedAt: null, // only active repositories
9+
},
10+
});
11+
12+
return NextResponse.json({ totalRepositories });
13+
} catch (error) {
14+
console.error("Failed to fetch repository stats:", error);
15+
return NextResponse.json(
16+
{ error: "Failed to fetch stats" },
17+
{ status: 500 },
18+
);
19+
}
20+
}

src/app/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const geistMono = Geist_Mono({
1515

1616
export const metadata: Metadata = {
1717
title: "Google Jules Task Queue",
18-
description: "Break free from the 5-task bottleneck and ship more.",
18+
description: "Break free from the concurrent task bottleneck and ship more.",
1919
};
2020

2121
export default function RootLayout({

src/app/page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
HowItWorks,
77
Navigation,
88
ProblemSection,
9+
StatsSection,
910
} from "@/components/landing";
1011

1112
export default function Home() {
@@ -14,6 +15,7 @@ export default function Home() {
1415
<Navigation />
1516
<HeroSection />
1617
<ProblemSection />
18+
<StatsSection />
1719
<HowItWorks />
1820
<FeaturesSection />
1921
<CTASection />

src/components/landing/hero-section.tsx

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ import {
1010
DialogTitle,
1111
DialogTrigger,
1212
} from "@/components/ui/dialog";
13+
import { useRepositoryStats } from "@/hooks/use-repository-stats";
1314
import { Copy, ExternalLink, Zap } from "lucide-react";
1415
import { useState } from "react";
1516
import { GitHubDashboard } from "./github-dashboard";
1617

1718
export function HeroSection() {
1819
const [copied, setCopied] = useState<string | null>(null);
20+
const { stats, isLoading } = useRepositoryStats();
1921

2022
const copyToClipboard = async (text: string, id: string) => {
2123
await navigator.clipboard.writeText(text);
@@ -66,11 +68,13 @@ export function HeroSection() {
6668

6769
<h1 className="text-4xl sm:text-5xl md:text-7xl font-bold mb-6 leading-tight text-white">
6870
<span className="sm:block">Queue tasks and avoid the</span>{" "}
69-
<span className="text-jules-secondary">5-task bottleneck</span>
71+
<span className="text-jules-secondary">
72+
concurrent task bottleneck
73+
</span>
7074
</h1>
7175

7276
<p className="text-lg sm:text-xl md:text-2xl mb-8 max-w-4xl mx-auto leading-relaxed text-jules-gray">
73-
Jules gives you 60 tasks per day but only 5 concurrent slots. Jules
77+
Jules gives you 15 tasks per day but only 3 concurrent slots.* Jules
7478
Task Queue automatically manages the queue so you can{" "}
7579
<span className="font-semibold text-jules-pink">
7680
actually use them all
@@ -80,6 +84,19 @@ export function HeroSection() {
8084

8185
<GitHubDashboard />
8286

87+
{/* Stats validation */}
88+
<div className="mb-6">
89+
{!isLoading && stats && (
90+
<p className="text-jules-gray text-sm">
91+
Trusted by{" "}
92+
<span className="font-semibold text-jules-cyan">
93+
{stats.totalRepositories.toLocaleString()}
94+
</span>{" "}
95+
repositories
96+
</p>
97+
)}
98+
</div>
99+
83100
<div className="flex flex-col sm:flex-row items-center justify-center space-y-4 sm:space-y-0 sm:space-x-6 mb-8">
84101
<GitHubInstallButton
85102
onInstallStart={handleInstallStart}

src/components/landing/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ export { HeroSection } from "./hero-section";
77
export { HowItWorks } from "./how-it-works";
88
export { Navigation } from "./navigation";
99
export { ProblemSection } from "./problem-section";
10+
export { StatsSection } from "./stats-section";

0 commit comments

Comments
 (0)